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