Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
swift-urlqueryitem-coder Sources URLQueryItemCoder Encoder Generic Implementation EncodingContainer+Keyed.swift
12 kB · 308 lines
Swift
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309//// EncodingsingleValueContainer+Keyed.swift// URLQueryItemCoder//// Created by Kyle Hughes on 1/15/23.//
extension EncodingContainer { internal final class Keyed { internal private(set) var children: [String: EncodingContainer] internal private(set) var codingPath: [any CodingKey] private let configuration: EncodingStrategies // MARK: Internal Initialization internal init(codingPath: [any CodingKey], configuration: EncodingStrategies) { self.codingPath = codingPath self.configuration = configuration children = [:] } // MARK: Internal Instance Interface internal func wrapped<NestedKey>() -> Wrapper<NestedKey> { Wrapper(self) } // MARK: Private Instance Interface private func nextCodingPath(appending key: any CodingKey) -> [any CodingKey] { var nextCodingPath = codingPath nextCodingPath.append(key) return nextCodingPath } }}
// MARK: - KeyedEncodingsingleValueContainerProtocol Extension
extension EncodingContainer.Keyed: KeyedEncodingContainerProtocol { // MARK: Internal Instance Interface internal func encode(_ value: Bool, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Double, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Float, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Int, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Int8, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Int16, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Int32, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: Int64, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: String, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: UInt, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: UInt8, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: UInt16, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: UInt32, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode(_ value: UInt64, forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encode(value) children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func encode<Value>(_ value: Value, forKey key: StringCodingKey) throws where Value: Encodable { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey)
children[encodedKey.stringValue] = try .encodeWithSpecialTreatment( value, at: nextCodingPath, using: configuration ) } internal func encodeNil(forKey key: StringCodingKey) throws { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let singleValueContainer = EncodingContainer.SingleValue( codingPath: nextCodingPath, configuration: configuration ) try singleValueContainer.encodeNil() children[encodedKey.stringValue] = .singleValue(singleValueContainer) } internal func nestedContainer<NestedKey>( keyedBy keyType: NestedKey.Type, forKey key: StringCodingKey ) -> KeyedEncodingContainer<NestedKey> where NestedKey: CodingKey { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let keyedContainer = EncodingContainer.Keyed(codingPath: nextCodingPath, configuration: configuration)
children[encodedKey.stringValue] = .keyed(keyedContainer) return KeyedEncodingContainer(keyedContainer.wrapped()) } internal func nestedUnkeyedContainer(forKey key: StringCodingKey) -> UnkeyedEncodingContainer { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let unkeyedContainer = EncodingContainer.Unkeyed(codingPath: nextCodingPath, configuration: configuration) children[encodedKey.stringValue] = .unkeyed(unkeyedContainer) return unkeyedContainer } internal func superEncoder() -> Encoder { let key = StringCodingKey(stringValue: "super") return superEncoder(forKey: key) } internal func superEncoder(forKey key: StringCodingKey) -> Encoder { let encodedKey = configuration.keyStrategy.encode(key, at: codingPath) let nextCodingPath = nextCodingPath(appending: encodedKey) let lowLevelEncoder = LowLevelEncoder(codingPath: nextCodingPath, configuration: configuration) children[encodedKey.stringValue] = .lowLevelEncoder(lowLevelEncoder) return lowLevelEncoder }}