this repo has no description
at main 70 lines 2.1 kB view raw
1// 2// LowLevelEncoder.swift 3// URLQueryItemCoder 4// 5// Created by Kyle Hughes on 1/15/23. 6// 7 8internal final class LowLevelEncoder { 9 internal let userInfo: [CodingUserInfoKey: Any] 10 11 internal private(set) var codingPath: [any CodingKey] 12 internal private(set) var container: EncodingContainer? 13 14 private let configuration: EncodingStrategies 15 16 // MARK: Internal Initialization 17 18 internal init(codingPath: [any CodingKey], configuration: EncodingStrategies) { 19 self.codingPath = codingPath 20 self.configuration = configuration 21 22 container = nil 23 userInfo = [:] 24 } 25 26 // MARK: Private Instance Interface 27 28 private func preconditionCanEncodeNewContainer() { 29 precondition( 30 container == nil, 31 "A container was already created for the low level encoder." 32 ) 33 } 34} 35 36// MARK: - Encoder Extension 37 38extension LowLevelEncoder: Encoder { 39 // MARK: Internal Instance Interface 40 41 internal func container<Key>(keyedBy type: Key.Type) -> KeyedEncodingContainer<Key> where Key: CodingKey { 42 preconditionCanEncodeNewContainer() 43 44 let keyedContainer = EncodingContainer.Keyed(codingPath: codingPath, configuration: configuration) 45 46 container = .keyed(keyedContainer) 47 48 return KeyedEncodingContainer(keyedContainer.wrapped()) 49 } 50 51 internal func singleValueContainer() -> SingleValueEncodingContainer { 52 preconditionCanEncodeNewContainer() 53 54 let singleValueContainer = EncodingContainer.SingleValue(codingPath: codingPath, configuration: configuration) 55 56 container = .singleValue(singleValueContainer) 57 58 return singleValueContainer 59 } 60 61 internal func unkeyedContainer() -> UnkeyedEncodingContainer { 62 preconditionCanEncodeNewContainer() 63 64 let unkeyedContainer = EncodingContainer.Unkeyed(codingPath: codingPath, configuration: configuration) 65 66 container = .unkeyed(unkeyedContainer) 67 68 return unkeyedContainer 69 } 70}