From d3ff208d500424c439021805ecd9907f97e22197 Mon Sep 17 00:00:00 2001
From: Juan Manuel Gentili <gentilijuanmanuel80974a@gmail.com>
Date: Sun, 14 May 2023 12:24:55 -0300
Subject: [PATCH] Add DecodingError as associated type

---
 Sources/CoreNetworking/HTTPClient.swift       | 19 +++++++++++++------
 Sources/CoreNetworking/Request.swift          |  6 +++---
 .../CoreNetworkingTests.swift                 | 11 ++++++++++-
 3 files changed, 26 insertions(+), 10 deletions(-)

diff --git a/Sources/CoreNetworking/HTTPClient.swift b/Sources/CoreNetworking/HTTPClient.swift
index 8079fb5..19117e1 100644
--- a/Sources/CoreNetworking/HTTPClient.swift
+++ b/Sources/CoreNetworking/HTTPClient.swift
@@ -22,13 +22,20 @@ public class HTTPClient {
         }
         switch response.statusCode {
         case 200...299:
-            guard let decodedResponse = try? jsonDecoder.decode(
-                responseType,
-                from: data
-            ) else {
-                throw Request.RequestError.decode
+            do {
+                let decodedResponse = try jsonDecoder.decode(
+                    responseType,
+                    from: data
+                )
+                
+                return decodedResponse
+            } catch {
+                guard let decodingError = error as? DecodingError else {
+                    throw Request.RequestError.decode()
+                }
+                
+                throw Request.RequestError.decode(decodingError)
             }
-            return decodedResponse
         case 401:
             throw Request.RequestError.unauthorized
         default:
diff --git a/Sources/CoreNetworking/Request.swift b/Sources/CoreNetworking/Request.swift
index 9713357..000b744 100644
--- a/Sources/CoreNetworking/Request.swift
+++ b/Sources/CoreNetworking/Request.swift
@@ -61,15 +61,15 @@ public extension Request {
     }
 
     enum RequestError: Error {
-        case decode
+        case decode(DecodingError? = nil)
         case noResponse
         case unauthorized
         case unexpectedStatusCode
 
         var customMessage: String {
             switch self {
-            case .decode:
-                return "Decode error"
+            case .decode(let underlyingError):
+                return "Decode error: \(String(describing: underlyingError))"
             case .unauthorized:
                 return "Session expired"
             default:
diff --git a/Tests/CoreNetworkingTests/CoreNetworkingTests.swift b/Tests/CoreNetworkingTests/CoreNetworkingTests.swift
index 020643e..5fdc865 100644
--- a/Tests/CoreNetworkingTests/CoreNetworkingTests.swift
+++ b/Tests/CoreNetworkingTests/CoreNetworkingTests.swift
@@ -36,8 +36,17 @@ final class CoreNetworkingTests: XCTestCase {
         do {
             _ = try await service.fetchCatFact()
             XCTFail("Should have thrown")
+        } catch let Request.RequestError.decode(DecodingError.keyNotFound(key, context)?) {
+            XCTAssertEqual(key.intValue, nil)
+            XCTAssertEqual(key.stringValue, "fact")
+            XCTAssertEqual(context.codingPath.count, 0)
+            XCTAssertEqual(
+                context.debugDescription,
+                "No value associated with key CodingKeys(stringValue: \"fact\", intValue: nil) (\"fact\")."
+            )
+            XCTAssertNil(context.underlyingError)
         } catch {
-            XCTAssertEqual(error as? Request.RequestError, .decode)
+            XCTFail("Should have thrown RequestError.decode error")
         }
     }
 }