From 32b160505d01edb702798b67f6c8ba287651de82 Mon Sep 17 00:00:00 2001 From: Nam Kennic Date: Sun, 19 Feb 2023 15:59:30 +0700 Subject: [PATCH 1/3] ParseError has originalError to store original error data --- .../ParseSwift/Extensions/URLSession.swift | 8 +++-- Sources/ParseSwift/Types/ParseError.swift | 29 +++++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/Sources/ParseSwift/Extensions/URLSession.swift b/Sources/ParseSwift/Extensions/URLSession.swift index 60ff25e92..c82374ef9 100644 --- a/Sources/ParseSwift/Extensions/URLSession.swift +++ b/Sources/ParseSwift/Extensions/URLSession.swift @@ -68,14 +68,16 @@ internal extension URLSession { if let responseError = responseError { guard let parseError = responseError as? ParseError else { return .failure(ParseError(code: .unknownError, - message: "Unable to connect with parse-server: \(responseError)")) + message: "Unable to connect with parse-server: \(responseError)", + originalError: responseError)) } return .failure(parseError) } guard let response = urlResponse else { guard let parseError = responseError as? ParseError else { - return .failure(ParseError(code: .unknownError, - message: "No response from server")) + return .failure(ParseError(code: .unknownError, + message: "No response from server", + originalError: responseError)) } return .failure(parseError) } diff --git a/Sources/ParseSwift/Types/ParseError.swift b/Sources/ParseSwift/Types/ParseError.swift index 2667cde98..bd3f98216 100644 --- a/Sources/ParseSwift/Types/ParseError.swift +++ b/Sources/ParseSwift/Types/ParseError.swift @@ -12,12 +12,25 @@ import Foundation An object with a Parse code and message. */ public struct ParseError: ParseTypeable, Swift.Error { + + public static func == (lhs: ParseError, rhs: ParseError) -> Bool { + if let lhsE = lhs.originalError as? NSError, + let rhsE = rhs.originalError as? NSError + { + return lhsE.code == rhsE.code + } + + return lhs.code == rhs.code + } + /// The value representing the error from the Parse Server. public let code: Code /// The text representing the error from the Parse Server. public let message: String /// An error value representing a custom error from the Parse Server. public let otherCode: Int? + /// The original error + public let originalError: Swift.Error? let error: String? enum CodingKeys: String, CodingKey { @@ -379,7 +392,22 @@ public extension ParseError { self.message = message self.otherCode = nil self.error = nil + self.originalError = nil } + + /** + Create an error with a known code and custom message. + - parameter code: The known Parse code. + - parameter message: The custom message. + - parameter originalError: The original Error. + */ + init(code: Code, message: String, originalError: Error? = nil) { + self.code = code + self.message = message + self.otherCode = nil + self.error = nil + self.originalError = originalError + } /** Create an error with a custom code and custom message. @@ -391,6 +419,7 @@ public extension ParseError { self.message = message self.otherCode = otherCode self.error = nil + self.originalError = nil } } From 4dd1ea3ad03624696215f17f65b581ef2b0ebf75 Mon Sep 17 00:00:00 2001 From: Nam Kennic Date: Sun, 19 Feb 2023 16:03:53 +0700 Subject: [PATCH 2/3] no message --- Sources/ParseSwift/Types/ParseError.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/Sources/ParseSwift/Types/ParseError.swift b/Sources/ParseSwift/Types/ParseError.swift index bd3f98216..5e5c6e4c4 100644 --- a/Sources/ParseSwift/Types/ParseError.swift +++ b/Sources/ParseSwift/Types/ParseError.swift @@ -448,6 +448,7 @@ extension ParseError { message = try values.decode(String.self, forKey: .error) } self.error = nil + self.originalError = nil } } From d4a7c748758c51e781ca5d06393cd6f69002d3a4 Mon Sep 17 00:00:00 2001 From: Nam Kennic Date: Mon, 6 Mar 2023 22:52:10 +0700 Subject: [PATCH 3/3] Inlcude original error when returning ParseError for easier to parse error details --- Sources/ParseSwift/Extensions/URLSession.swift | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Sources/ParseSwift/Extensions/URLSession.swift b/Sources/ParseSwift/Extensions/URLSession.swift index c82374ef9..31693cf54 100644 --- a/Sources/ParseSwift/Extensions/URLSession.swift +++ b/Sources/ParseSwift/Extensions/URLSession.swift @@ -118,11 +118,13 @@ internal extension URLSession { } return .failure(ParseError(code: .unknownError, // swiftlint:disable:next line_length - message: "Error decoding parse-server response: \(response) with error: \(String(describing: error)) Format: \(String(describing: String(data: responseData, encoding: .utf8)))")) + message: "Error decoding parse-server response: \(response) with error: \(String(describing: error)) Format: \(String(describing: String(data: responseData, encoding: .utf8)))", + originalError: nsError)) } return .failure(ParseError(code: .unknownError, // swiftlint:disable:next line_length - message: "Error decoding parse-server response: \(response) with error: \(String(describing: error)) Format: \(String(describing: String(data: json, encoding: .utf8)))")) + message: "Error decoding parse-server response: \(response) with error: \(String(describing: error)) Format: \(String(describing: String(data: json, encoding: .utf8)))", + originalError: error)) } return .failure(parseError) } @@ -140,14 +142,16 @@ internal extension URLSession { guard let response = urlResponse else { guard let parseError = responseError as? ParseError else { return .failure(ParseError(code: .unknownError, - message: "No response from server")) + message: "No response from server", + originalError: responseError)) } return .failure(parseError) } if let responseError = responseError { guard let parseError = responseError as? ParseError else { return .failure(ParseError(code: .unknownError, - message: "Unable to connect with parse-server: \(responseError)")) + message: "Unable to connect with parse-server: \(responseError)", + originalError: responseError)) } return .failure(parseError) } @@ -159,7 +163,8 @@ internal extension URLSession { } catch { let defaultError = ParseError(code: .unknownError, // swiftlint:disable:next line_length - message: "Error decoding parse-server response: \(response) with error: \(String(describing: error))") + message: "Error decoding parse-server response: \(response) with error: \(String(describing: error))", + originalError: error) let parseError = error as? ParseError ?? defaultError return .failure(parseError) }