11import Foundation
22
3- struct Arguments {
3+ public struct Arguments {
44 enum Error : Swift . Error {
55 case keyNotFound( String )
66 case couldNotParse( Parsable . Type )
@@ -72,22 +72,49 @@ public struct QueryParameters {
7272 private var storage : [ URLQueryItem ]
7373}
7474
75- public struct Context < UserInfo> {
75+ public protocol ContextProtocol {
76+ var url : URL { get }
77+ /// This struct is for internal usage.
78+ var internalArgumentsContainer : Arguments { get }
79+ var queryParameters : QueryParameters { get }
80+ }
81+
82+ extension ContextProtocol {
83+ func attach< UserInfo> ( _ userInfo: UserInfo ) -> Context < UserInfo > {
84+ Context < UserInfo > ( url: url, internalArgumentsContainer: internalArgumentsContainer, queryParameters: queryParameters, userInfo: userInfo)
85+ }
86+ }
87+
88+ struct AbstractContext : ContextProtocol {
89+ let url : URL
90+ let internalArgumentsContainer : Arguments
91+ let queryParameters : QueryParameters
92+
93+ init ( url: URL , arguments: Arguments , queryParameters: QueryParameters ) {
94+ self . url = url
95+ self . internalArgumentsContainer = arguments
96+ self . queryParameters = queryParameters
97+ }
98+ }
99+
100+ public struct Context < UserInfo> : ContextProtocol {
76101 public let url : URL
77- private let arguments : Arguments
102+ public let internalArgumentsContainer : Arguments
78103 public let queryParameters : QueryParameters
79104 public let userInfo : UserInfo
80105
81- internal init ( url: URL , arguments : Arguments , queryParameters: QueryParameters , userInfo: UserInfo ) {
106+ internal init ( url: URL , internalArgumentsContainer : Arguments , queryParameters: QueryParameters , userInfo: UserInfo ) {
82107 self . url = url
83- self . arguments = arguments
108+ self . internalArgumentsContainer = internalArgumentsContainer
84109 self . queryParameters = queryParameters
85110 self . userInfo = userInfo
86111 }
112+ }
87113
114+ extension ContextProtocol {
88115 @available ( * , deprecated, message: " subscript for an argument is depricated. " , renamed: " argument(named:) " )
89116 public subscript< T: Parsable > ( argument keyword: String ) -> T ? {
90- return try ? arguments . get ( named: keyword)
117+ return try ? internalArgumentsContainer . get ( named: keyword)
91118 }
92119
93120 @available ( * , deprecated, message: " Use queryParameters[key] instead " )
@@ -96,7 +123,7 @@ public struct Context<UserInfo> {
96123 }
97124
98125 public func argument< T: Parsable > ( named key: String , as type: T . Type = T . self) throws -> T {
99- return try arguments . get ( named: key)
126+ return try internalArgumentsContainer . get ( named: key)
100127 }
101128
102129 @available ( * , deprecated, renamed: " queryParameter(named:) " )
@@ -132,6 +159,6 @@ public struct Context<UserInfo> {
132159
133160extension Context where UserInfo == Void {
134161 init ( url: URL , arguments: Arguments , queryParameters: QueryParameters ) {
135- self . init ( url: url, arguments : arguments, queryParameters: queryParameters, userInfo: ( ) )
162+ self . init ( url: url, internalArgumentsContainer : arguments, queryParameters: queryParameters, userInfo: ( ) )
136163 }
137164}
0 commit comments