55
66import Foundation
77
8+ /// Helper functions for configuring a decoder's `userInfo` dictionary for decoding `Option`.
9+ /// Each of the overloads that does not require the configuration closure, will configure both
10+ /// `Option<T>` and `Option<T?>`.
11+ ///
12+ /// ```swift
13+ /// struct Container: ArgumentGroup, FormatterNode {
14+ /// let flagFormatter: FlagFormatter = .init(prefix: .doubleDash)
15+ /// let optionFormatter: OptionFormatter = .init(prefix: .doubleDash)
16+ /// @Option var option: String = "value"
17+ /// }
18+ /// let encoded = try JSONEncoder().encode(Container())
19+ /// let decoder = JSONDecoder()
20+ /// decoder.userInfo.addOptionConfiguration(for: String.self)
21+ /// let decoded = try decoder.decode(Container.self, from: encoded)
22+ /// // decoded = ["--option", "value"]
23+ /// ```
824extension [ CodingUserInfoKey : Any ] {
925 public mutating func addOptionConfiguration< T> (
10- for _: Option < T > . Type ,
26+ for _: T . Type ,
1127 configuration: @escaping Option < T > . DecodingConfiguration
1228 ) where T: Decodable {
1329 guard let key = Option< T> . configurationCodingUserInfoKey( ) else {
@@ -16,46 +32,24 @@ extension [CodingUserInfoKey: Any] {
1632 self [ key] = configuration
1733 }
1834
19- public mutating func addOptionConfiguration< T> ( for _: Option < T > . Type ) where T: Decodable ,
20- T: CustomStringConvertible
21- {
22- addOptionConfiguration ( for: Option< T> . self , configuration: Option< T> . unwrap( _: ) )
23- addOptionConfiguration ( for: Option< T> . self , configuration: Option< T?> . unwrap( _: ) )
24- }
25-
26- public mutating func addOptionConfiguration< T> ( for _: Option < T > . Type ) where T: Decodable , T: RawRepresentable ,
27- T. RawValue: CustomStringConvertible
28- {
29- addOptionConfiguration ( for: Option< T> . self , configuration: Option< T> . unwrap( _: ) )
30- addOptionConfiguration ( for: Option< T> . self , configuration: { $0. rawValue. description } )
31- }
32-
33- public mutating func addOptionConfiguration< T> ( for _: Option < T > . Type ) where T: Decodable ,
34- T: CustomStringConvertible ,
35- T: RawRepresentable , T. RawValue: CustomStringConvertible
36- {
37- addOptionConfiguration ( for: Option< T> . self , configuration: Option< T> . unwrap( _: ) )
38- addOptionConfiguration ( for: Option< T> . self , configuration: Option< T?> . unwrap( _: ) )
39- }
40-
4135 public mutating func addOptionConfiguration< T> ( for _: T . Type ) where T: Decodable ,
4236 T: CustomStringConvertible
4337 {
44- addOptionConfiguration ( for: Option < T > . self , configuration: Option< T> . unwrap( _: ) )
45- addOptionConfiguration ( for: Option < T > . self , configuration: Option< T?> . unwrap( _: ) )
38+ addOptionConfiguration ( for: T . self, configuration: Option< T> . unwrap( _: ) )
39+ addOptionConfiguration ( for: T . self, configuration: Option< T?> . unwrap( _: ) )
4640 }
4741
4842 public mutating func addOptionConfiguration< T> ( for _: T . Type ) where T: Decodable , T: RawRepresentable ,
4943 T. RawValue: CustomStringConvertible
5044 {
51- addOptionConfiguration ( for: Option < T > . self , configuration: Option< T> . unwrap( _: ) )
52- addOptionConfiguration ( for: Option < T > . self , configuration: { $0. rawValue. description } )
45+ addOptionConfiguration ( for: T . self, configuration: Option< T> . unwrap( _: ) )
46+ addOptionConfiguration ( for: T . self, configuration: { $0. rawValue. description } )
5347 }
5448
5549 public mutating func addOptionConfiguration< T> ( for _: T . Type ) where T: Decodable , T: CustomStringConvertible ,
5650 T: RawRepresentable , T. RawValue: CustomStringConvertible
5751 {
58- addOptionConfiguration ( for: Option < T > . self , configuration: Option< T> . unwrap( _: ) )
59- addOptionConfiguration ( for: Option < T > . self , configuration: Option< T?> . unwrap( _: ) )
52+ addOptionConfiguration ( for: T . self, configuration: Option< T> . unwrap( _: ) )
53+ addOptionConfiguration ( for: T . self, configuration: Option< T?> . unwrap( _: ) )
6054 }
6155}
0 commit comments