From a756a2541b269d0f7d9e5af3466ee13386c27ba6 Mon Sep 17 00:00:00 2001 From: Pranjal Satija Date: Sun, 10 Sep 2017 17:54:45 -0500 Subject: [PATCH] Remove fatal errors when unwrapping optionals If a request fails to return decodable data or an error, a catch all error is returned instead of a fatal error being raised. --- .DS_Store | Bin 6148 -> 6148 bytes ParseSwift.xcodeproj/project.pbxproj | 6 -- .../Object Protocols/ObjectType.swift | 4 +- .../Object Protocols/UserType.swift | 4 +- Sources/ParseSwift/Result.swift | 70 ------------------ Sources/ParseSwift/Synchronous.swift | 2 +- Sources/ParseSwift/Types/Pointer.swift | 2 +- Sources/ParseSwift/Types/Query.swift | 6 +- Sources/ParseSwift/Utilities/ParseError.swift | 6 ++ 9 files changed, 15 insertions(+), 85 deletions(-) delete mode 100644 Sources/ParseSwift/Result.swift diff --git a/.DS_Store b/.DS_Store index a47337479b9ca219684f55ee942cf89623240049..36f5873633d93c6871482fc649d356b62f633611 100644 GIT binary patch delta 38 ucmZoMXffE}#>m8m8bWAXt;9p>D8m&uzMEjMpq3=snWf{h6{ diff --git a/ParseSwift.xcodeproj/project.pbxproj b/ParseSwift.xcodeproj/project.pbxproj index c5ccb3a28..fa22946cf 100644 --- a/ParseSwift.xcodeproj/project.pbxproj +++ b/ParseSwift.xcodeproj/project.pbxproj @@ -25,7 +25,6 @@ 4A82B7F61F254CCE0063D731 /* Parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7EE1F254B820063D731 /* Parse.swift */; }; 4A82B7F71F254CCE0063D731 /* ObjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7EC1F254B820063D731 /* ObjectType.swift */; }; 4A82B7F81F254CCE0063D731 /* Pointer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7F11F254B820063D731 /* Pointer.swift */; }; - 4A82B7F91F254CCE0063D731 /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7F21F254B820063D731 /* Result.swift */; }; 4A82B7FF1F256A8F0063D731 /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7FE1F256A8F0063D731 /* Query.swift */; }; 4A82B8011F256B330063D731 /* ObjectType+Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B8001F256B330063D731 /* ObjectType+Query.swift */; }; 4A99A4691F2650CA00D72A59 /* ParseMutationContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A99A4681F2650CA00D72A59 /* ParseMutationContainer.swift */; }; @@ -53,7 +52,6 @@ 4AFDA7341F26DAE1002AE4FC /* Pointer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7F11F254B820063D731 /* Pointer.swift */; }; 4AFDA7351F26DAE1002AE4FC /* Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7FE1F256A8F0063D731 /* Query.swift */; }; 4AFDA7361F26DAE1002AE4FC /* ObjectType+Query.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B8001F256B330063D731 /* ObjectType+Query.swift */; }; - 4AFDA7371F26DAE1002AE4FC /* Result.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7F21F254B820063D731 /* Result.swift */; }; 4AFDA7391F26DAF8002AE4FC /* Parse.h in Headers */ = {isa = PBXBuildFile; fileRef = 4AB8B4F71F254AE10070F682 /* Parse.h */; settings = {ATTRIBUTES = (Public, ); }; }; AFA0808E1F65C72600D95158 /* Saving.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA0808D1F65C72600D95158 /* Saving.swift */; }; AFA080901F65C73A00D95158 /* Fetching.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFA0808F1F65C73A00D95158 /* Fetching.swift */; }; @@ -87,7 +85,6 @@ 4A82B7EE1F254B820063D731 /* Parse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Parse.swift; sourceTree = ""; }; 4A82B7F01F254B820063D731 /* File.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = File.swift; sourceTree = ""; }; 4A82B7F11F254B820063D731 /* Pointer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Pointer.swift; sourceTree = ""; }; - 4A82B7F21F254B820063D731 /* Result.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Result.swift; sourceTree = ""; }; 4A82B7FE1F256A8F0063D731 /* Query.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Query.swift; sourceTree = ""; }; 4A82B8001F256B330063D731 /* ObjectType+Query.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "ObjectType+Query.swift"; sourceTree = ""; }; 4A99A4681F2650CA00D72A59 /* ParseMutationContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseMutationContainer.swift; sourceTree = ""; }; @@ -234,7 +231,6 @@ 4AC397761F4895A200DEA9D3 /* Object Protocols */, 4A82B7FD1F25691B0063D731 /* Types */, AFA080951F65C86400D95158 /* Utilities */, - 4A82B7F21F254B820063D731 /* Result.swift */, 4A2F149C1F4A604900A7A7EF /* Encoder */, 4A99A46A1F2650E200D72A59 /* Mutations */, 4AC397771F4895C000DEA9D3 /* REST */, @@ -494,7 +490,6 @@ 4A99A46E1F26512100D72A59 /* IncrementOperation.swift in Sources */, 4A82B8011F256B330063D731 /* ObjectType+Query.swift in Sources */, 4A82B7FF1F256A8F0063D731 /* Query.swift in Sources */, - 4A82B7F91F254CCE0063D731 /* Result.swift in Sources */, AFA080921F65C7B900D95158 /* ParseError.swift in Sources */, 4A2F14981F4A5F6900A7A7EF /* ObjectType+Batch.swift in Sources */, 4A82B7F41F254CCE0063D731 /* File.swift in Sources */, @@ -525,7 +520,6 @@ 4AFDA7301F26DAE1002AE4FC /* DeleteOperation.swift in Sources */, 4AFDA7361F26DAE1002AE4FC /* ObjectType+Query.swift in Sources */, 4AFDA7341F26DAE1002AE4FC /* Pointer.swift in Sources */, - 4AFDA7371F26DAE1002AE4FC /* Result.swift in Sources */, 4AFDA72A1F26DAE1002AE4FC /* Parse.swift in Sources */, 4AFDA7351F26DAE1002AE4FC /* Query.swift in Sources */, 4A2F14921F4A434100A7A7EF /* Synchronous.swift in Sources */, diff --git a/Sources/ParseSwift/Object Protocols/ObjectType.swift b/Sources/ParseSwift/Object Protocols/ObjectType.swift index c77bbe5dc..2896139c5 100644 --- a/Sources/ParseSwift/Object Protocols/ObjectType.swift +++ b/Sources/ParseSwift/Object Protocols/ObjectType.swift @@ -82,7 +82,7 @@ public extension ObjectType { } else if let error = error { callback?(nil, error) } else { - fatalError() + callback?(nil, ParseError.unknownResult()) } } } @@ -107,7 +107,7 @@ public extension ObjectType { } else if let error = error { callback?(nil, error) } else { - fatalError() + callback?(nil, ParseError.unknownResult()) } } } diff --git a/Sources/ParseSwift/Object Protocols/UserType.swift b/Sources/ParseSwift/Object Protocols/UserType.swift index 6cd3c5be9..83bc45039 100644 --- a/Sources/ParseSwift/Object Protocols/UserType.swift +++ b/Sources/ParseSwift/Object Protocols/UserType.swift @@ -56,7 +56,7 @@ extension UserType { } else if let error = error { callback?(nil, error) } else { - fatalError() + callback?(nil, ParseError.unknownResult()) } } } @@ -91,7 +91,7 @@ extension UserType { } else if let error = error { callback?(nil, error) } else { - fatalError() + callback?(nil, ParseError.unknownResult()) } } } diff --git a/Sources/ParseSwift/Result.swift b/Sources/ParseSwift/Result.swift deleted file mode 100644 index 876924198..000000000 --- a/Sources/ParseSwift/Result.swift +++ /dev/null @@ -1,70 +0,0 @@ -import Foundation - -public enum Result { - case success(T) - case error(Error) - case unknown - - public init(_ response: T?, _ error: Error?) { - if let error = error { - self = .error(error) - } else if let response = response { - self = .success(response) - } else { - self = .unknown - } - } - - func map(_ transform: (T) throws -> U) -> Result { - switch self { - case .success(let success): - do { - return .success(try transform(success)) - } catch let e { - return .error(e) - } - case .error(let error): - return .error(error) - default: return .unknown - } - } - - public func flatMap(_ transform: (T) throws -> Result) rethrows -> Result { - switch self { - case .success(let success): - do { - return try transform(success) - } catch let e { - return .error(e) - } - case .error(let error): - return .error(error) - default: return .unknown - } - } -} - -extension Result where T == Data { - func decode() -> Result where U: Decodable { - return map { data -> U in - return try getDecoder().decode(U.self, from: data) - } - } - - func map(_ mapper: (T) throws -> U) -> Result { - switch self { - case .success(let data): - do { - return .success(try mapper(data)) - } catch let e { - do { // try default error mapper :) - return .error(try getDecoder().decode(ParseError.self, from: data)) - } catch {} - return .error(e) - } - case .error(let error): - return .error(error) - default: return .unknown - } - } -} diff --git a/Sources/ParseSwift/Synchronous.swift b/Sources/ParseSwift/Synchronous.swift index 3ee6fd055..864abad22 100644 --- a/Sources/ParseSwift/Synchronous.swift +++ b/Sources/ParseSwift/Synchronous.swift @@ -24,7 +24,7 @@ private func await(block: (@escaping BlockCapturing) -> Void) throws -> T } else if let error = error { throw error } else { - fatalError() + throw ParseError.unknownResult() } } diff --git a/Sources/ParseSwift/Types/Pointer.swift b/Sources/ParseSwift/Types/Pointer.swift index 4cc08ab09..46b791b9a 100644 --- a/Sources/ParseSwift/Types/Pointer.swift +++ b/Sources/ParseSwift/Types/Pointer.swift @@ -43,7 +43,7 @@ extension Pointer { } else if let error = error { callback(nil, error) } else { - fatalError() + callback(nil, ParseError.unknownResult()) } } } diff --git a/Sources/ParseSwift/Types/Query.swift b/Sources/ParseSwift/Types/Query.swift index f5109c1f2..150e47745 100644 --- a/Sources/ParseSwift/Types/Query.swift +++ b/Sources/ParseSwift/Types/Query.swift @@ -209,7 +209,7 @@ extension Query: Querying { } else if let error = error { callback(nil, error) } else { - fatalError() + callback(nil, ParseError.unknownResult()) } } } @@ -228,7 +228,7 @@ extension Query: Querying { } else if let error = error { callback(nil, error) } else { - fatalError() + callback(nil, ParseError.unknownResult()) } } } @@ -248,7 +248,7 @@ extension Query: Querying { } else if let error = error { callback(nil, error) } else { - fatalError() + callback(nil, ParseError.unknownResult()) } } } diff --git a/Sources/ParseSwift/Utilities/ParseError.swift b/Sources/ParseSwift/Utilities/ParseError.swift index 68b7011f6..09e150735 100644 --- a/Sources/ParseSwift/Utilities/ParseError.swift +++ b/Sources/ParseSwift/Utilities/ParseError.swift @@ -12,3 +12,9 @@ public struct ParseError: Error, Decodable { let code: Int let error: String } + +extension ParseError { + static func unknownResult() -> NSError { + return NSError(domain: "Neither data nor error was set.", code: -1, userInfo: nil) + } +}