This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

Swift 100.0%
8 2 0

Clone this repository

https://git.vm.fail/woody.fm/swift-urlqueryitem-coder https://git.vm.fail/did:plc:tg7ozud34b5mvj62em2vblxc
ssh://git@knot1.tangled.sh:2222/woody.fm/swift-urlqueryitem-coder ssh://git@knot1.tangled.sh:2222/did:plc:tg7ozud34b5mvj62em2vblxc

For self-hosted knots, clone URLs may differ based on your setup.


README.md

URLQueryItemCoder#

Platform Versions + Android Swift Versions Test

Encoder & decoder for working with Codable types as URLQueryItems.

About#

URLQueryItemCoder provides an implementation of Swift's Encoder protocol suitable for encoding an Encodable type as an array of URLQueryItems, and an implementation of Swift's Decoder protocol suitable for decoding a Decodable type from an array of URLQueryItems.

This allows us to lift URLQueryItem requirements into the type system (e.g. modeling an HTTP GET API).

Capabilities#

URLQueryItemCoder is an exhaustive implementation with an exhaustive test suite.

Standard#

All standard features expected by the protocols are supported.

  • Single-value containers
  • Keyed containers
  • Unkeyed containers
  • Nested containers
  • Inheritance

Extra#

All extra features offered by Swift's JSON implementations are supported.

  • Data special treatment
  • Date special treatment
  • Double & Float special treatment
  • Key conversions
  • Sorted keys

Usage#

Encoding#

URLQueryItemEncoder can be configured through its initializer or strategies and outputFormatting properties.

For example, given…

import URLQueryItemCoder

struct Interval: Codable {
    let start: Date
    let end: Date
}

struct GetPostsQuery: Codable {    
    let interval: Interval
    let userID: String
}

let interval = Interval(start: .now.addingTimeInterval(-1_000), end: .now)
let query = GetPostsQuery(interval: interval, userID: "123abc")

Then…

let encoder = URLQueryItemEncoder(dateStrategy: .secondsSince1970)
let queryItems = try! encoder.encode(query)
// [
//     URLQueryItem(name: "interval.end", value: "1681256918.240762"),
//     URLQueryItem(name: "interval.start", value: "1681255918.240762"),
//     URLQueryItem(name: "userID", value: "123abc"),
// ]

Decoding#

URLQueryItemDecoder can be configured through its initializer or strategy property.

For example, given…

import URLQueryItemCoder

struct GetPostsQuery: Codable {
    struct Interval: Codable {
        let start: Date
        let end: Date
    }
    
    let interval: Interval
    let userID: String
}

let queryItems = [
    URLQueryItem(name: "interval.start", value: "1681255918.240762"),
    URLQueryItem(name: "interval.end", value: "1681256918.240762"),
    URLQueryItem(name: "userID", value: "123abc"),
]

Then…

let decoder = URLQueryItemDecoder(dateStrategy: .secondsSince1970)
let query = try! decoder.decode(GetPostsQuery.self, from: queryItems)
// GetPostsQuery(
//     interval: Interval(start: 1681255918.240762, end: 1681256918.240762),
//     userID: "123abc"
// )

Supported Platforms#

  • iOS
  • macOS
  • tvOS
  • watchOS

Requirements#

  • Swift 5.7+

Installation#

Swift Package Manager#

dependencies: [
    .package(url: "https://github.com/kylehughes/URLQueryItemCoder.git", .upToNextMajor(from: "1.0.0")),
]

Documentation#

Documentation is available on GitHub Pages.

Contributions#

URLQueryItemCoder is not accepting source contributions at this time. Bug reports will be considered.

Author#

Kyle Hughes

my Mastodon

License#

URLQueryItemCoder is available under the MIT license.

See LICENSE for details.