this repo has no description
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}