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