mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-01-17 06:27:02 +01:00
WIP: error handling
This commit is contained in:
@@ -54,7 +54,7 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
|
||||
/**
|
||||
An internal SDK call failed with the specified `NSError`.
|
||||
*/
|
||||
case InternalError(NSError)
|
||||
case InternalError(NSError: NSError)
|
||||
|
||||
|
||||
// MARK: ErrorType
|
||||
@@ -68,14 +68,19 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
|
||||
|
||||
switch self {
|
||||
|
||||
case .Unknown: return 1
|
||||
case .DifferentStorageExistsAtURL: return 2
|
||||
case .MappingModelNotFound: return 3
|
||||
case .ProgressiveMigrationRequired: return 4
|
||||
case .InternalError: return 5
|
||||
case .Unknown: return Code.Unknown.rawValue
|
||||
case .DifferentStorageExistsAtURL: return Code.DifferentStorageExistsAtURL.rawValue
|
||||
case .MappingModelNotFound: return Code.MappingModelNotFound.rawValue
|
||||
case .ProgressiveMigrationRequired: return Code.ProgressiveMigrationRequired.rawValue
|
||||
case .InternalError: return Code.InternalError.rawValue
|
||||
}
|
||||
}
|
||||
|
||||
public var _userInfo: [NSObject: AnyObject] {
|
||||
|
||||
return ["test": 1]
|
||||
}
|
||||
|
||||
|
||||
// MARK: CustomStringConvertible
|
||||
|
||||
@@ -98,17 +103,19 @@ public enum CoreStoreError: ErrorType, CustomStringConvertible, CustomDebugStrin
|
||||
|
||||
internal init(_ error: ErrorType?) {
|
||||
|
||||
switch error {
|
||||
|
||||
case (let error as CoreStoreError)?:
|
||||
self = error
|
||||
|
||||
case (let error as NSError)?:
|
||||
self = .InternalError(error)
|
||||
|
||||
default:
|
||||
self = .Unknown
|
||||
}
|
||||
self = error.flatMap { $0.swift } ?? .Unknown
|
||||
}
|
||||
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private enum Code: Int {
|
||||
|
||||
case Unknown
|
||||
case DifferentStorageExistsAtURL
|
||||
case MappingModelNotFound
|
||||
case ProgressiveMigrationRequired
|
||||
case InternalError
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,3 +185,121 @@ public extension NSError {
|
||||
: nil)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: Internal
|
||||
|
||||
internal extension ErrorType {
|
||||
|
||||
internal var swift: CoreStoreError {
|
||||
|
||||
if case let error as CoreStoreError = self {
|
||||
|
||||
return error
|
||||
}
|
||||
|
||||
let error = self as NSError
|
||||
guard error.domain == "com.corestore.error" else {
|
||||
|
||||
return .InternalError(NSError: error)
|
||||
}
|
||||
|
||||
guard let code = CoreStoreError.Code(rawValue: error.code) else {
|
||||
|
||||
return .Unknown
|
||||
}
|
||||
|
||||
let info = error.userInfo
|
||||
switch code {
|
||||
|
||||
case .Unknown:
|
||||
return .Unknown
|
||||
|
||||
case .DifferentStorageExistsAtURL:
|
||||
guard case let existingPersistentStoreURL as NSURL = info["existingPersistentStoreURL"] else {
|
||||
|
||||
return .Unknown
|
||||
}
|
||||
return .DifferentStorageExistsAtURL(existingPersistentStoreURL: existingPersistentStoreURL)
|
||||
|
||||
case .MappingModelNotFound:
|
||||
guard let persistentStore = info["persistentStore"] as? NSPersistentStore,
|
||||
let storage = persistentStore.storageInterface as? LocalStorage,
|
||||
let targetModel = info["targetModel"] as? NSManagedObjectModel,
|
||||
let targetModelVersion = info["targetModelVersion"] as? String else {
|
||||
|
||||
return .Unknown
|
||||
}
|
||||
return .MappingModelNotFound(storage: storage, 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 .InternalError:
|
||||
guard case let NSError as NSError = info["NSError"] else {
|
||||
|
||||
return .Unknown
|
||||
}
|
||||
return .InternalError(NSError: NSError)
|
||||
|
||||
default:
|
||||
return .Unknown
|
||||
}
|
||||
}
|
||||
|
||||
internal var objc: NSError {
|
||||
|
||||
guard let error = self as? CoreStoreError else {
|
||||
|
||||
return self as NSError
|
||||
}
|
||||
|
||||
let domain = "com.corestore.error"
|
||||
let code: CoreStoreError.Code
|
||||
let info: [NSObject: AnyObject]
|
||||
switch error {
|
||||
|
||||
case .Unknown:
|
||||
return self as NSError
|
||||
|
||||
case .DifferentStorageExistsAtURL(let existingPersistentStoreURL):
|
||||
code = .DifferentStorageExistsAtURL
|
||||
info = [
|
||||
"existingPersistentStoreURL": existingPersistentStoreURL
|
||||
]
|
||||
|
||||
case .MappingModelNotFound(let storage, let targetModel, let targetModelVersion):
|
||||
code = .MappingModelNotFound
|
||||
info = [
|
||||
"storage": storage.objc,
|
||||
"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 .InternalError:
|
||||
guard case let NSError as NSError = info["NSError"] else {
|
||||
|
||||
return .Unknown
|
||||
}
|
||||
return .InternalError(NSError: NSError)
|
||||
|
||||
default:
|
||||
return self as NSError
|
||||
}
|
||||
|
||||
return NSError(domain: domain, code: code.rawValue, userInfo: info)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -96,7 +96,10 @@ extension CoreStoreLogger {
|
||||
Deprecated. Use `log(error:message:fileName:lineNumber:functionName:)` instead.
|
||||
*/
|
||||
@available(*, deprecated=2.0.0, message="Use log(error:message:fileName:lineNumber:functionName:) instead.")
|
||||
public func handleError(error error: NSError, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) {}
|
||||
public func handleError(error error: NSError, message: String, fileName: StaticString, lineNumber: Int, functionName: StaticString) {
|
||||
|
||||
self.log(error: (error as ErrorType) as! CoreStoreError, message: message, fileName: fileName, lineNumber: lineNumber, functionName: functionName)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
13
Sources/ObjectiveC/CSCoreStoreLogger.swift
Normal file
13
Sources/ObjectiveC/CSCoreStoreLogger.swift
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// CSCoreStoreLogger.swift
|
||||
// CoreStore
|
||||
//
|
||||
// Created by John Rommel Estropia on 2016/03/19.
|
||||
// Copyright © 2016 John Rommel Estropia. All rights reserved.
|
||||
//
|
||||
|
||||
import UIKit
|
||||
|
||||
class CSCoreStoreLogger: NSObject {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user