Skip to content

Commit e3e345d

Browse files
author
burak.uzunboy
committed
Network Layer now supports Custom Error Response models
1 parent 0332130 commit e3e345d

5 files changed

Lines changed: 23 additions & 16 deletions

File tree

Sources/UsefulNetworkLayer/Extensions/UIImage+ResponseImage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public extension UIImage {
2424
case .failure(_):
2525
completion(nil)
2626
case .success(let response):
27-
completion(response.responseBody.image)
27+
completion(response.responseBody?.image)
2828
}
2929
}
3030

Sources/UsefulNetworkLayer/Extensions/UIImageView+ImageURL.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ public extension UIImageView {
7777
completion?(fallback)
7878
case .success(let image):
7979
if self.tag == dateTag {
80-
self.image = image.responseBody.image
81-
completion?(image.responseBody.image)
80+
self.image = image.responseBody?.image
81+
completion?(image.responseBody?.image)
8282
}
8383
}
8484
}

Sources/UsefulNetworkLayer/NetworkLayer/APIStructs.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,12 +56,12 @@ extension Array: ResponseBodyParsable where Element: ResponseBodyParsable {
5656
public struct APIResponse<T> where T: ResponseBodyParsable {
5757

5858
/// Response body of the API request.
59-
public private(set) var responseBody: T
59+
public private(set) var responseBody: T?
6060

6161
/// Main URL response of the API request.
6262
public private(set) var response: URLResponse
6363

64-
internal init(response: URLResponse, responseBody: T) {
64+
internal init(response: URLResponse, responseBody: T?) {
6565
self.response = response
6666
self.responseBody = responseBody
6767
}

Sources/UsefulNetworkLayer/NetworkLayer/NetworkLayer.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,19 @@ public class NetworkLayer: NSObject, URLSessionDataDelegate {
207207
do {
208208
message.customMessage = (try JSONDecoder().decode(request.errorResponseBodyObject.T.self, from: data))
209209
} catch {
210-
self.sendLog(message: "Custom error message couldn't be created for Lperation: \(operationId)", logType: .info)
210+
self.sendLog(message: "Custom error message couldn't be created for Operation: \(operationId)", logType: .info)
211211
}
212212
self.sendLog(message: "HTTP Request failed with status \(statusCode) \(message)", logType: .error(code: statusCode, name: ""))
213213
completion(.failure(.init(request: request, error: message)))
214214
return
215215
}
216216

217+
guard data.count > 0 else {
218+
self.sendLog(message: "Data of the response is empty - Ignoring response creation - Operation: \(operationId)", logType: .info)
219+
completion(.success(.init(response: response, responseBody: nil)))
220+
return
221+
}
222+
217223
if !request.responseBodyObject.shouldUseCustomInitializer {
218224
do {
219225
let jsonObject = try JSONDecoder().decode(request.responseBodyObject, from: data)

Tests/iOSUsefulNetworkLayerTests/iOSUsefulNetworkLayerTests.swift

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ final class iOSUsefulNetworkLayerTests: XCTestCase {
3030
apiReq.request { (result) in
3131
switch result {
3232
case .failure(let err):
33-
XCTFail("Error: \(err.errorReason.error?.localizedDescription)")
33+
XCTFail("Error: \(err.errorReason.error?.localizedDescription ?? "")")
3434
break
3535
case .success(let obj):
3636
print(obj)
@@ -44,14 +44,15 @@ final class iOSUsefulNetworkLayerTests: XCTestCase {
4444
func testNetworkLayerArray() {
4545
let exp = XCTestExpectation(description: "Network layer should response success")
4646

47-
let api = APIConfiguration<[ExampleResponseObject], DefaultAPIError>(hostURL: "https://jsonplaceholder.typicode.com",
48-
endPoint: "todos",
49-
requestType: .get,
50-
headers: nil, body: nil,
51-
responseBodyObject: [ExampleResponseObject].self,
52-
priority: .low,
53-
cachingTime: .init(seconds: 60),
54-
isMainOperation: false, autoCache: true)
47+
let api = APIConfiguration(hostURL: "https://jsonplaceholder.typicode.com",
48+
endPoint: "todos",
49+
requestType: .get,
50+
headers: nil, body: nil,
51+
responseBodyObject: [ExampleResponseObject].self,
52+
errorType: DefaultAPIError.self,
53+
priority: .low,
54+
cachingTime: .init(seconds: 60),
55+
isMainOperation: false, autoCache: true)
5556

5657
guard let apiReq = api else {
5758
XCTFail()
@@ -61,7 +62,7 @@ final class iOSUsefulNetworkLayerTests: XCTestCase {
6162
apiReq.request { (result) in
6263
switch result {
6364
case .failure(let err):
64-
XCTFail("Error: \(err.errorReason.error?.localizedDescription)")
65+
XCTFail("Error: \(err.errorReason.error?.localizedDescription ?? "")")
6566
break
6667
case .success(let obj):
6768
print(obj)

0 commit comments

Comments
 (0)