diff --git a/Sources/SwiftRestRequests/Deserializer.swift b/Sources/SwiftRestRequests/Deserializer.swift index 2334979..cf1d028 100644 --- a/Sources/SwiftRestRequests/Deserializer.swift +++ b/Sources/SwiftRestRequests/Deserializer.swift @@ -29,6 +29,8 @@ public protocol Deserializer: Sendable { /// Value for the `Accept` header sent alongside the request (for example `application/json`). var acceptHeader: String { get } + var jsonDecoder: JSONDecoder? { get } + /// Creates a new instance of the deserializer. init() @@ -44,12 +46,14 @@ public struct DecodableDeserializer: Deserializer { public typealias ResponseType = T + public var jsonDecoder: JSONDecoder? = JSONDecoder() + public let acceptHeader = MimeType.ApplicationJson.rawValue public init() { } public func deserialize(_ data: Data) throws -> T { - return try JSONDecoder().decode(T.self, from: data) + return try jsonDecoder!.decode(T.self, from: data) } } @@ -59,6 +63,8 @@ public struct VoidDeserializer: Deserializer { public typealias ResponseType = Void + public var jsonDecoder: JSONDecoder? = nil + public let acceptHeader = MimeType.Void.rawValue public init() { } @@ -74,6 +80,8 @@ public struct VoidDeserializer: Deserializer { public struct DataDeserializer: Deserializer { public typealias ResponseType = Data + + public var jsonDecoder: JSONDecoder? = nil public let acceptHeader = MimeType.ApplicationOctetStream.rawValue diff --git a/Sources/SwiftRestRequests/RestApiCaller.swift b/Sources/SwiftRestRequests/RestApiCaller.swift index d8d899d..4f45482 100644 --- a/Sources/SwiftRestRequests/RestApiCaller.swift +++ b/Sources/SwiftRestRequests/RestApiCaller.swift @@ -272,6 +272,9 @@ open class RestApiCaller : NSObject { /// - Returns: The data returned by server and the corresponding `HTTPURLResponse` private func makeCall(_ relativePath: String?, httpMethod: HTTPMethod, payload: Data?, responseDeserializer: T, options: RestOptions) async throws -> (T.ResponseType?, HTTPStatusCode) { + // for deserializer with decoder set date decoding strategy + responseDeserializer.jsonDecoder?.dateDecodingStrategy = options.dateDecodingStrategy + let (data, httpResponse) = try await dataTask(relativePath: relativePath, httpMethod: httpMethod.rawValue, accept: responseDeserializer.acceptHeader, payload: payload, options: options) let httpStatus = httpResponse.status diff --git a/Sources/SwiftRestRequests/RestOptions.swift b/Sources/SwiftRestRequests/RestOptions.swift index 271806f..7d99c58 100644 --- a/Sources/SwiftRestRequests/RestOptions.swift +++ b/Sources/SwiftRestRequests/RestOptions.swift @@ -43,6 +43,9 @@ public struct RestOptions { /// Any response outside of this set triggers a `RestError.unexpectedHttpStatusCode`. public var expectedStatusCodes: [HTTPStatusCode]? + /// Decode the `Date` as an ISO-8601-formatted string (in RFC 3339 format). + public var dateDecodingStrategy = JSONDecoder.DateDecodingStrategy.iso8601 + /// Creates a new instance with default timeout and without overrides. public init() {} } diff --git a/Tests/SwiftRestRequestsTests/AbstractRestApiCallerTests.swift b/Tests/SwiftRestRequestsTests/AbstractRestApiCallerTests.swift index c33110b..a0a62d5 100644 --- a/Tests/SwiftRestRequestsTests/AbstractRestApiCallerTests.swift +++ b/Tests/SwiftRestRequestsTests/AbstractRestApiCallerTests.swift @@ -22,13 +22,6 @@ class AbstractRestApiCallerTests: XCTestCase { loggingLock.lock() defer { loggingLock.unlock() } - #if os(Linux) - // Configure `swift-log` default logger - #else - /// Configure `swift-log` logging system to use OSLog backend - LoggingSystem.bootstrap(OSLogHandler.init) - #endif - Logger.SwiftRestRequests.security.logLevel = .trace Logger.SwiftRestRequests.interceptor.logLevel = .trace Logger.SwiftRestRequests.apiCaller.logLevel = .trace