Skip to content

Commit e7866bf

Browse files
committed
Added: HTTPURLResponse to: NetworkError.serializationError(let error, let response, let data).
1 parent d9c4dc4 commit e7866bf

18 files changed

+96
-65
lines changed

Source/NetworkError.swift

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public enum NetworkError: Error, Sendable {
3636
/// Error on the server (HTTP Error 500...511)
3737
case serverError(response: HTTPURLResponse?, data: Data?)
3838
/// Parsing the body into expected type failed.
39-
case serializationError(error: Error, data: Data?)
39+
case serializationError(error: Error, response: HTTPURLResponse, data: Data?)
4040
/// Complete request failed.
4141
case requestError(error: Error)
4242

@@ -75,21 +75,21 @@ extension NetworkError: CustomDebugStringConvertible {
7575
case .cancelled:
7676
return "Request cancelled"
7777
case .unauthorized(let response, let data):
78-
return "Authorization error: \(response), response: ".appendingContentsOf(data: data)
78+
return "Authorization error, response headers: \(response), response body: ".appendingContentsOf(data: data)
7979
case .clientError(let response, let data):
8080
if let response = response {
81-
return "Client error: \((response)), response: ".appendingContentsOf(data: data)
81+
return "Client error, response headers: \((response)), response body: ".appendingContentsOf(data: data)
8282
}
83-
return "Client error, response: ".appendingContentsOf(data: data)
84-
case .serializationError(let description, let data):
85-
return "Serialization error: \(description), response: ".appendingContentsOf(data: data)
83+
return "Client error, response headers: nil, response body: ".appendingContentsOf(data: data)
84+
case .serializationError(let error, let response, let data):
85+
return "Serialization error: \(error), response headers: \(response), response body: ".appendingContentsOf(data: data)
8686
case .requestError(let error):
8787
return "Request error: \(error)"
8888
case .serverError(let response, let data):
89-
if let response = response {
90-
return "Server error: \(String(describing: response)), response: ".appendingContentsOf(data: data)
89+
if let response {
90+
return "Server error, response headers: \(String(describing: response)), response body: ".appendingContentsOf(data: data)
9191
} else {
92-
return "Server error: nil, response: ".appendingContentsOf(data: data)
92+
return "Server error: nil, response body: ".appendingContentsOf(data: data)
9393
}
9494
}
9595
}

Source/NetworkServices/BasicNetworkService.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ public final class BasicNetworkService: NetworkService {
8484
}
8585

8686
do {
87-
return .success((try resource.parse(data), response))
87+
return .success((try resource.parse(response, data), response))
8888
} catch let error {
89-
return .failure(.serializationError(error: error, data: data))
89+
return .failure(.serializationError(error: error, response: response, data: data))
9090
}
9191
} catch let error {
9292
if case URLError.cancelled = error {

Source/NetworkServices/NetworkServiceMock.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ public final class NetworkServiceMock: NetworkService, @unchecked Sendable {
182182
switch scheduled {
183183
case .success((let data, let httpURLResponse)):
184184
do {
185-
let result = try resource.parse(data)
185+
let result = try resource.parse(httpURLResponse, data)
186186
return .success((result, httpURLResponse))
187187
} catch {
188188
fatalError("Not able to parse data. Error: \(error)")

Source/Resource+Decodable.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@ extension Resource where Model: Decodable {
3333
/// - decoder: a decoder which can decode the payload into the model type
3434
/// - mapError: a closure which maps to Error
3535
public init(request: URLRequest, decoder: JSONDecoder, mapError: @escaping @Sendable (_ networkError: NetworkError) -> E) {
36-
self.init(request: request, parse: { try decoder.decode(Model.self, from: $0) }, mapError: mapError)
36+
self.init(request: request, parse: {
37+
try decoder.decode(Model.self, from: $1)
38+
},
39+
mapError: mapError
40+
)
3741
}
3842
}
3943

@@ -47,6 +51,12 @@ extension Resource where Model: Decodable, E: NetworkErrorConvertible {
4751
/// - decoder: a decoder which can decode the payload into the model type
4852
/// - mapError: a closure which maps to Error
4953
public init(request: URLRequest, decoder: JSONDecoder) {
50-
self.init(request: request, parse: { try decoder.decode(Model.self, from: $0) }, mapError: { E(networkError: $0) })
54+
self.init(request: request, parse: {
55+
try decoder.decode(Model.self, from: $1)
56+
},
57+
mapError: {
58+
E(networkError: $0)
59+
}
60+
)
5161
}
5262
}

Source/Resource+Inspect.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ extension Resource {
3636
- parameter inspector: closure which gets passed the data
3737
- returns: a new resource which gets instepcted before parsing
3838
*/
39-
public func inspectData(_ inspector: @escaping @Sendable (Data) -> Void) -> Resource<Model, E> {
40-
let parse: @Sendable (Data) throws -> Model = { data in
41-
inspector(data)
42-
return try self.parse(data)
39+
public func inspectData(_ inspector: @escaping @Sendable (HTTPURLResponse, Data) -> Void) -> Resource<Model, E> {
40+
let parse: @Sendable (HTTPURLResponse, Data) throws -> Model = { response, data in
41+
inspector(response, data)
42+
return try self.parse(response, data)
4343
}
4444
return Resource<Model, E>(request: request, parse: parse, mapError: mapError)
4545
}

Source/Resource+Map.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ extension Resource {
3030
public func map<T>(transform: @escaping @Sendable (Model) throws -> T) -> Resource<T, E> {
3131
return Resource<T, E>(
3232
request: request,
33-
parse: { return try transform(try self.parse($0)) },
33+
parse: { response, data in
34+
return try transform(try self.parse(response, data))
35+
},
3436
mapError: mapError
3537
)
3638
}

Source/Resource+Void.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public extension Resource where Model == Void {
1515
/// - request: The request to get the remote data payload
1616
/// - mapError: a closure which maps to Error
1717
init(request: URLRequest, mapError: @escaping @Sendable (_ networkError: NetworkError) -> E) {
18-
self.init(request: request, parse: { _ in }, mapError: mapError)
18+
self.init(request: request, parse: { _, _ in }, mapError: mapError)
1919
}
2020
}
2121

@@ -26,7 +26,7 @@ public extension Resource where Model == Void, E: NetworkErrorConvertible {
2626
/// - Parameters:
2727
/// - request: The request to get the remote data payload
2828
init(request: URLRequest) {
29-
self.init(request: request, parse: { _ in }, mapError: { E(networkError: $0) })
29+
self.init(request: request, parse: { _, _ in }, mapError: { E(networkError: $0) })
3030
}
3131

3232
}

Source/Resource.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public struct Resource<Model, E: Error>: Sendable {
4040
public let request: URLRequest
4141

4242
/// Parses data into given model.
43-
public let parse: @Sendable (_ data: Data) throws -> Model
43+
public let parse: @Sendable (_ response: HTTPURLResponse, _ data: Data) throws -> Model
4444
public let mapError: @Sendable (_ networkError: NetworkError) -> E
4545

4646
/// Creates a type safe resource, which can be used to fetch it with NetworkService
@@ -49,7 +49,7 @@ public struct Resource<Model, E: Error>: Sendable {
4949
/// - request: The request to get the remote data payload
5050
/// - parse: Parses data fetched with the request into given Model
5151

52-
public init(request: URLRequest, parse: @escaping @Sendable (Data) throws -> Model, mapError: @escaping @Sendable (_ networkError: NetworkError) -> E) {
52+
public init(request: URLRequest, parse: @escaping @Sendable (HTTPURLResponse, Data) throws -> Model, mapError: @escaping @Sendable (_ networkError: NetworkError) -> E) {
5353
self.request = request
5454
self.parse = parse
5555
self.mapError = mapError

Source/ResourceWithError+NetworkErrorConvertible.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Foundation
99

1010
public extension Resource where E: NetworkErrorConvertible {
1111

12-
init(request: URLRequest, parse: @escaping @Sendable (Data) throws -> Model) {
12+
init(request: URLRequest, parse: @escaping @Sendable (HTTPURLResponse, Data) throws -> Model) {
1313
self.request = request
1414
self.parse = parse
1515
self.mapError = { E(networkError: $0) }

Tests/DecodableResoureTest.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,25 @@ class DecodableResoureTest: XCTestCase {
3333

3434
func testResource_withValidData() {
3535
//When
36-
let fetchedTrain = try? resource.parse(Train.validJSONData)
37-
36+
let fetchedTrain = try? resource.parse(HTTPURLResponse.defaultMock, Train.validJSONData)
37+
3838
//Then
3939
XCTAssertEqual(fetchedTrain?.name, "ICE")
4040
}
4141

4242
func testResource_withMAppedResult() {
4343
//When
4444
let nameResource = resource.map { $0.name }
45-
let fetchedTrainName = try? nameResource.parse(Train.validJSONData)
46-
45+
let fetchedTrainName = try? nameResource.parse(HTTPURLResponse.defaultMock, Train.validJSONData)
46+
4747
//Then
4848
XCTAssertEqual(fetchedTrainName, "ICE")
4949
}
5050

5151
func testResource_WithInvalidData() throws {
5252
//When
5353
do {
54-
_ = try resource.parse(Train.invalidJSONData)
54+
_ = try resource.parse(HTTPURLResponse.defaultMock, Train.invalidJSONData)
5555
XCTFail("Expected method to throws")
5656
} catch { }
5757
}

0 commit comments

Comments
 (0)