From 24008d62b204e8bd426cd54a618caad2f211fce0 Mon Sep 17 00:00:00 2001 From: John Rommel Estropia Date: Tue, 22 Mar 2016 22:51:42 +0900 Subject: [PATCH] WIP: error handling --- CoreStoreTests/CoreStoreTests.swift | 4 -- Sources/CoreStoreError.swift | 63 ++++++++++----------- Sources/Migrating/DataStack+Migration.swift | 8 +-- 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/CoreStoreTests/CoreStoreTests.swift b/CoreStoreTests/CoreStoreTests.swift index c46920f..f96d947 100644 --- a/CoreStoreTests/CoreStoreTests.swift +++ b/CoreStoreTests/CoreStoreTests.swift @@ -44,10 +44,6 @@ class CoreStoreTests: XCTestCase { func testExample() { - let err = CoreStoreError.DifferentStorageExistsAtURL(existingPersistentStoreURL: NSURL(string: "http://google.com")!) - let err1 = err as NSError - let err2 = err1 as! CoreStoreError - let stack = DataStack(modelName: "Model", bundle: NSBundle(forClass: self.dynamicType)) CoreStore.defaultStack = stack XCTAssert(CoreStore.defaultStack === stack, "CoreStore.defaultStack === stack") diff --git a/Sources/CoreStoreError.swift b/Sources/CoreStoreError.swift index e63305d..5c02533 100644 --- a/Sources/CoreStoreError.swift +++ b/Sources/CoreStoreError.swift @@ -44,12 +44,12 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin /** An `NSMappingModel` could not be found for a specific source and destination model versions. */ - case MappingModelNotFound(storage: LocalStorage, targetModel: NSManagedObjectModel, targetModelVersion: String) + case MappingModelNotFound(localStoreURL: NSURL, targetModel: NSManagedObjectModel, targetModelVersion: String) /** Progressive migrations are disabled for a store, but an `NSMappingModel` could not be found for a specific source and destination model versions. */ - case ProgressiveMigrationRequired(storage: LocalStorage) + case ProgressiveMigrationRequired(localStoreURL: NSURL) /** An internal SDK call failed with the specified `NSError`. @@ -87,7 +87,7 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin public var description: String { // TODO: - return (self as NSError).description + return self.objc.description } @@ -198,7 +198,11 @@ internal extension ErrorType { return error } - let error = self as NSError + guard let error = (self as Any) as? NSError else { + + return .Unknown + } + guard error.domain == "com.corestore.error" else { return .InternalError(NSError: error) @@ -223,22 +227,20 @@ internal extension ErrorType { return .DifferentStorageExistsAtURL(existingPersistentStoreURL: existingPersistentStoreURL) case .MappingModelNotFound: - guard let persistentStore = info["persistentStore"] as? NSPersistentStore, - let storage = persistentStore.storageInterface as? LocalStorage, + guard let localStoreURL = info["localStoreURL"] as? NSURL, let targetModel = info["targetModel"] as? NSManagedObjectModel, let targetModelVersion = info["targetModelVersion"] as? String else { return .Unknown } - return .MappingModelNotFound(storage: storage, targetModel: targetModel, targetModelVersion: targetModelVersion) + return .MappingModelNotFound(localStoreURL: localStoreURL, targetModel: targetModel, targetModelVersion: targetModelVersion) case .ProgressiveMigrationRequired: - guard let persistentStore = info["persistentStore"] as? NSPersistentStore, - let storage = persistentStore.storageInterface as? LocalStorage else { + guard let localStoreURL = info["localStoreURL"] as? NSURL else { return .Unknown } - return .ProgressiveMigrationRequired(storage: storage) + return .ProgressiveMigrationRequired(localStoreURL: localStoreURL) case .InternalError: guard case let NSError as NSError = info["NSError"] else { @@ -246,26 +248,25 @@ internal extension ErrorType { return .Unknown } return .InternalError(NSError: NSError) - - default: - return .Unknown } } internal var objc: NSError { + let domain = "com.corestore.error" guard let error = self as? CoreStoreError else { - return self as NSError + return ((self as Any) as? NSError) + ?? NSError(domain: domain, code: CoreStoreError.Code.Unknown.rawValue, userInfo: [:]) } - let domain = "com.corestore.error" let code: CoreStoreError.Code let info: [NSObject: AnyObject] switch error { case .Unknown: - return self as NSError + code = .Unknown + info = [:] case .DifferentStorageExistsAtURL(let existingPersistentStoreURL): code = .DifferentStorageExistsAtURL @@ -273,31 +274,25 @@ internal extension ErrorType { "existingPersistentStoreURL": existingPersistentStoreURL ] - case .MappingModelNotFound(let storage, let targetModel, let targetModelVersion): + case .MappingModelNotFound(let localStoreURL, let targetModel, let targetModelVersion): code = .MappingModelNotFound info = [ - "storage": storage.objc, + "localStoreURL": localStoreURL, "targetModel": targetModel, "targetModelVersion": targetModelVersion ] - case .ProgressiveMigrationRequired: - guard let persistentStore = info["persistentStore"] as? NSPersistentStore, - let storage = persistentStore.storageInterface as? LocalStorage else { - - return .Unknown - } - return .ProgressiveMigrationRequired(storage: storage) + case .ProgressiveMigrationRequired(let localStoreURL): + code = .ProgressiveMigrationRequired + info = [ + "localStoreURL": localStoreURL + ] - case .InternalError: - guard case let NSError as NSError = info["NSError"] else { - - return .Unknown - } - return .InternalError(NSError: NSError) - - default: - return self as NSError + case .InternalError(let NSError): + code = .InternalError + info = [ + "NSError": NSError + ] } return NSError(domain: domain, code: code.rawValue, userInfo: info) diff --git a/Sources/Migrating/DataStack+Migration.swift b/Sources/Migrating/DataStack+Migration.swift index e979444..e60a260 100644 --- a/Sources/Migrating/DataStack+Migration.swift +++ b/Sources/Migrating/DataStack+Migration.swift @@ -345,7 +345,7 @@ public extension DataStack { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else { let error = CoreStoreError.MappingModelNotFound( - storage: storage, + localStoreURL: fileURL, targetModel: self.model, targetModelVersion: self.modelVersion ) @@ -358,7 +358,7 @@ public extension DataStack { if migrationSteps.count > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) { - let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage) + let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: fileURL) CoreStore.log( error, "Failed to find migration mapping from the \(typeName(storage)) at URL \"\(fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations." @@ -393,7 +393,7 @@ public extension DataStack { guard let migrationSteps = self.computeMigrationFromStorage(storage, metadata: metadata) else { let error = CoreStoreError.MappingModelNotFound( - storage: storage, + localStoreURL: storage.fileURL, targetModel: self.model, targetModelVersion: self.modelVersion ) @@ -421,7 +421,7 @@ public extension DataStack { } else if numberOfMigrations > 1 && storage.localStorageOptions.contains(.PreventProgressiveMigration) { - let error = CoreStoreError.ProgressiveMigrationRequired(storage: storage) + let error = CoreStoreError.ProgressiveMigrationRequired(localStoreURL: storage.fileURL) CoreStore.log( error, "Failed to find migration mapping from the \(typeName(storage)) at URL \"\(storage.fileURL)\" to version model \"\(self.modelVersion)\" without requiring progessive migrations."