@@ -2,44 +2,46 @@ import Foundation
22
33/// a type defining some parameters for a `Session`
44public struct SessionConfiguration {
5- /// encoder to use for request bodies
6- let encoder : ContentDataEncoder
7- /// decoder used to decode http responses
8- let decoder : ContentDataDecoder
5+ /// data encoders/decoders configuration per content type
6+ let data : ContentDataCoderConfiguration
97 /// queue on which to decode data
108 let decodingQueue : DispatchQueue
119 /// an interceptor to apply custom behavior on the session requests/responses.
1210 /// To apply multiple interceptors use `ComposeInterceptor`
1311 let interceptor : Interceptor
14- /// a function decoding data (using `decoder`) as a custom error
15- private( set) var errorConverter : DataErrorDecoder ?
12+ /// a function decoding data as a custom error given the response content type
13+ private( set) var errorConverter : ContentDataErrorDecoder ?
1614
17- /// - Parameter encoder to use for request bodies
18- /// - Parameter decoder used to decode http responses
15+ /// - Parameter data: encoders/decoders configuration per content type
1916 /// - Parameter decodeQueue: queue on which to decode data
2017 /// - Parameter interceptors: interceptor list to apply on the session requests/responses
2118 public init (
22- encoder: ContentDataEncoder = JSONEncoder ( ) ,
23- decoder: ContentDataDecoder = JSONDecoder ( ) ,
19+ data: ContentDataCoderConfiguration = . init( ) ,
2420 decodingQueue: DispatchQueue = . main,
2521 interceptors: CompositeInterceptor = [ ] ) {
26- self . encoder = encoder
27- self . decoder = decoder
22+ self . data = data
2823 self . decodingQueue = decodingQueue
2924 self . interceptor = interceptors
3025 }
3126
3227 /// - Parameter dataError: Error type to use when having error with data
3328 public init < DataError: Error & Decodable > (
34- encoder: ContentDataEncoder = JSONEncoder ( ) ,
35- decoder: ContentDataDecoder = JSONDecoder ( ) ,
29+ data: ContentDataCoderConfiguration ,
3630 decodingQueue: DispatchQueue = . main,
3731 interceptors: CompositeInterceptor = [ ] ,
3832 dataError: DataError . Type
3933 ) {
40- self . init ( encoder: encoder, decoder: decoder, decodingQueue: decodingQueue, interceptors: interceptors)
41- self . errorConverter = {
42- try decoder. decode ( dataError, from: $0)
34+ self . init ( data: data, decodingQueue: decodingQueue, interceptors: interceptors)
35+ self . errorConverter = { [ decoder= data. decoder] data, contentType in
36+ guard let decoder = decoder [ contentType] else {
37+ throw SessionConfigurationError . missingDecoder ( contentType)
38+ }
39+ return try decoder. decode ( dataError, from: data)
4340 }
4441 }
4542}
43+
44+ public enum SessionConfigurationError : Error {
45+ case missingEncoder( HTTPContentType )
46+ case missingDecoder( HTTPContentType )
47+ }
0 commit comments