Encoder & decoder for working with Codable types as URLQueryItems.
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).
URLQueryItemCoder is an exhaustive implementation with an exhaustive test suite.
All standard features expected by the protocols are supported.
- Single-value containers
- Keyed containers
- Unkeyed containers
- Nested containers
- Inheritance
All extra features offered by Swift's JSON implementations are supported.
-
Dataspecial treatment -
Datespecial treatment -
Double&Floatspecial treatment - Key conversions
- Sorted keys
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"),
// ]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"
// )- iOS
- macOS
- tvOS
- watchOS
- Swift 5.7+
dependencies: [
.package(url: "https://github.com/kylehughes/URLQueryItemCoder.git", .upToNextMajor(from: "1.0.0")),
]Documentation is available on GitHub Pages..
URLQueryItemCoder is not accepting source contributions at this time. Bug reports will be considered.
URLQueryItemCoder is available under the MIT license.
See LICENSE for details.