--- /dev/null
+//
+// OAuthSwiftError.swift
+// OAuthSwift
+//
+// Created by phimage on 02/10/16.
+// Copyright © 2016 Dongri Jin. All rights reserved.
+//
+
+import Foundation
+
+// MARK: - OAuthSwift errors
+public enum OAuthSwiftError: Error {
+
+ /// Configuration problem with oauth provider.
+ case configurationError(message: String)
+ /// The provided token is expired, retrieve new token by using the refresh token
+ case tokenExpired(error: Error?)
+ /// State missing from request (you can set allowMissingStateCheck = true to ignore)
+ case missingState
+ /// Returned state value is wrong
+ case stateNotEqual(state: String, responseState: String)
+ /// Error from server
+ case serverError(message: String)
+ /// Failed to create URL \(urlString) not convertible to URL, please encode
+ case encodingError(urlString: String)
+ case authorizationPending
+ /// Failed to create request with \(urlString)
+ case requestCreation(message: String)
+ /// Authentification failed. No token
+ case missingToken
+ /// Please retain OAuthSwift object or handle
+ case retain
+ /// Request error
+ case requestError(error: Error, request: URLRequest)
+ /// Request cancelled
+ case cancelled
+
+ public static let Domain = "OAuthSwiftError"
+ public static let ResponseDataKey = "OAuthSwiftError.response.data"
+ public static let ResponseKey = "OAuthSwiftError.response"
+
+ fileprivate enum Code: Int {
+ case configurationError = -1
+ case tokenExpired = -2
+ case missingState = -3
+ case stateNotEqual = -4
+ case serverError = -5
+ case encodingError = -6
+ case authorizationPending = -7
+ case requestCreation = -8
+ case missingToken = -9
+ case retain = -10
+ case requestError = -11
+ case cancelled = -12
+ }
+
+ fileprivate var code: Code {
+ switch self {
+ case .configurationError: return Code.configurationError
+ case .tokenExpired: return Code.tokenExpired
+ case .missingState: return Code.missingState
+ case .stateNotEqual: return Code.stateNotEqual
+ case .serverError: return Code.serverError
+ case .encodingError: return Code.encodingError
+ case .authorizationPending: return Code.authorizationPending
+ case .requestCreation: return Code.requestCreation
+ case .missingToken: return Code.missingToken
+ case .retain: return Code.retain
+ case .requestError: return Code.requestError
+ case .cancelled : return Code.cancelled
+ }
+ }
+
+ public var underlyingError: Error? {
+ switch self {
+ case .tokenExpired(let e): return e
+ case .requestError(let e, _): return e
+ default: return nil
+ }
+ }
+
+ public var underlyingMessage: String? {
+ switch self {
+ case .serverError(let m): return m
+ case .configurationError(let m): return m
+ case .requestCreation(let m): return m
+ default: return nil
+ }
+ }
+
+}
+
+extension OAuthSwiftError: CustomStringConvertible {
+
+ public var description: String {
+ switch self {
+ case .configurationError(let m): return "configurationError[\(m)]"
+ case .tokenExpired(let e): return "tokenExpired[\(String(describing: e))]"
+ case .missingState: return "missingState"
+ case .stateNotEqual(let s, let e): return "stateNotEqual[\(s)<>\(e)]"
+ case .serverError(let m): return "serverError[\(m)]"
+ case .encodingError(let urlString): return "encodingError[\(urlString)]"
+ case .authorizationPending: return "authorizationPending"
+ case .requestCreation(let m): return "requestCreation[\(m)]"
+ case .missingToken: return "missingToken"
+ case .retain: return "retain"
+ case .requestError(let e, _): return "requestError[\(e)]"
+ case .cancelled : return "cancelled"
+ }
+ }
+}
+
+extension OAuthSwift {
+
+ static func retainError(_ failureHandler: FailureHandler?) {
+ #if !OAUTH_NO_RETAIN_ERROR
+ failureHandler?(OAuthSwiftError.retain)
+ #endif
+ }
+
+}
+
+// MARK: NSError
+extension OAuthSwiftError: CustomNSError {
+
+ public static var errorDomain: String { return OAuthSwiftError.Domain }
+
+ public var errorCode: Int { return self.code.rawValue }
+
+ /// The user-info dictionary.
+ public var errorUserInfo: [String: Any] {
+ switch self {
+ case .configurationError(let m): return ["message": m]
+ case .serverError(let m): return ["message": m]
+ case .requestCreation(let m): return ["message": m]
+
+ case .tokenExpired(let e): return ["error": e as Any]
+ case .requestError(let e, let request): return ["error": e, "request": request]
+
+ case .encodingError(let urlString): return ["url": urlString]
+
+ case .stateNotEqual(let s, let e): return ["state": s, "expected": e]
+ default: return [:]
+ }
+ }
+
+ public var _code: Int {
+ return self.code.rawValue
+ }
+ public var _domain: String {
+ return OAuthSwiftError.Domain
+ }
+}