this repo has no description
at main 80 lines 2.5 kB view raw
1// 2// LowLevelDecoder.swift 3// URLQueryItemCoder 4// 5// Created by Kyle Hughes on 1/19/23. 6// 7 8import Foundation 9 10internal final class LowLevelDecoder<PrimitiveValue> where PrimitiveValue: DecodingPrimitiveValue { 11 internal let container: DecodingContainer<PrimitiveValue> 12 internal let userInfo: [CodingUserInfoKey: Any] 13 14 // MARK: Internal Initialization 15 16 internal init(container: DecodingContainer<PrimitiveValue>) { 17 self.container = container 18 19 userInfo = [:] 20 } 21 22 // MARK: Internal Instance Interface 23 24 func decodeWithSpecialTreatment<Target>(as target: Target.Type) throws -> Target where Target: Decodable { 25 switch target { 26 case is Data.Type: 27 return try container.configuration.dataStrategy.decode(insideOf: self) as! Target 28 case is Date.Type: 29 return try container.configuration.dateStrategy.decode(insideOf: self) as! Target 30 default: 31 return try Target(from: self) 32 } 33 } 34} 35 36// MARK: - Decoder Extension 37 38extension LowLevelDecoder: Decoder { 39 // MARK: Internal Instance Interface 40 41 @inlinable 42 internal var codingPath: [any CodingKey] { 43 switch container { 44 case let .multiValue(multiValueContainer): 45 return multiValueContainer.codingPath 46 case let .singleValue(singleValueContainer): 47 return singleValueContainer.codingPath 48 } 49 } 50 51 @inlinable 52 internal func container<Key>(keyedBy type: Key.Type) throws -> KeyedDecodingContainer<Key> where Key: CodingKey { 53 switch container { 54 case let .multiValue(multiValueContainer): 55 return KeyedDecodingContainer(multiValueContainer.wrapped()) 56 case let .singleValue(singleValueContainer): 57 return KeyedDecodingContainer(singleValueContainer.wrapped()) 58 } 59 } 60 61 @inlinable 62 internal func singleValueContainer() throws -> SingleValueDecodingContainer { 63 switch container { 64 case let .multiValue(multiValueContainer): 65 return multiValueContainer 66 case let .singleValue(singleValueContainer): 67 return singleValueContainer 68 } 69 } 70 71 @inlinable 72 internal func unkeyedContainer() throws -> UnkeyedDecodingContainer { 73 switch container { 74 case let .multiValue(multiValueContainer): 75 return multiValueContainer 76 case let .singleValue(singleValueContainer): 77 return singleValueContainer 78 } 79 } 80}