diff --git a/Heimdallr/Core/Heimdallr.swift b/Heimdallr/Core/Heimdallr.swift index 96087d2..8df5b35 100644 --- a/Heimdallr/Core/Heimdallr.swift +++ b/Heimdallr/Core/Heimdallr.swift @@ -60,7 +60,7 @@ public let HeimdallrErrorNotAuthorized = 2 /// /// - returns: A new client initialized with the given token endpoint URL, /// credentials and access token store. - public init(tokenURL: NSURL, credentials: OAuthClientCredentials? = nil, accessTokenStore: OAuthAccessTokenStore = OAuthAccessTokenKeychainStore(), accessTokenParser: OAuthAccessTokenParser = OAuthAccessTokenDefaultParser(), httpClient: HeimdallrHTTPClient = HeimdallrHTTPClientNSURLSession(), resourceRequestAuthenticator: HeimdallResourceRequestAuthenticator = HeimdallResourceRequestAuthenticatorHTTPAuthorizationHeader()) { + @objc public init(tokenURL: NSURL, credentials: OAuthClientCredentials? = nil, accessTokenStore: OAuthAccessTokenStore = OAuthAccessTokenKeychainStore(), accessTokenParser: OAuthAccessTokenParser = OAuthAccessTokenDefaultParser(), httpClient: HeimdallrHTTPClient = HeimdallrHTTPClientNSURLSession(), resourceRequestAuthenticator: HeimdallResourceRequestAuthenticator = HeimdallResourceRequestAuthenticatorHTTPAuthorizationHeader()) { self.tokenURL = tokenURL self.credentials = credentials self.accessTokenStore = accessTokenStore @@ -143,7 +143,8 @@ public let HeimdallrErrorNotAuthorized = 2 if let error = error { completion(.Failure(error)) } else if (response as! NSHTTPURLResponse).statusCode == 200 { - switch self.accessTokenParser.parse(data!) { + let accessTokenResult = materialize { try self.accessTokenParser.parse(data!) } + switch accessTokenResult { case let .Success(accessToken): self.accessToken = accessToken completion(.Success(accessToken)) diff --git a/Heimdallr/Core/OAuthAccessTokenDefaultParser.swift b/Heimdallr/Core/OAuthAccessTokenDefaultParser.swift index 8db8942..48cfc6f 100644 --- a/Heimdallr/Core/OAuthAccessTokenDefaultParser.swift +++ b/Heimdallr/Core/OAuthAccessTokenDefaultParser.swift @@ -1,16 +1,13 @@ import Foundation import Result -@objc -public class OAuthAccessTokenDefaultParser: NSObject, OAuthAccessTokenParser { - public func parse(data: NSData) -> Result { - - if let token = OAuthAccessToken.decode(data: data) { - return .Success(token) - } else { - let error = NSError(domain: HeimdallrErrorDomain, code: HeimdallrErrorInvalidData, userInfo: nil) - return .Failure(error) +@objc public class OAuthAccessTokenDefaultParser: NSObject, OAuthAccessTokenParser { + public func parse(data: NSData) throws -> OAuthAccessToken { + + guard let token = OAuthAccessToken.decode(data: data) else { + throw NSError(domain: HeimdallrErrorDomain, code: HeimdallrErrorInvalidData, userInfo: nil) } + + return token } } - diff --git a/Heimdallr/Core/OAuthAccessTokenParser.swift b/Heimdallr/Core/OAuthAccessTokenParser.swift index 7e70563..2452b2e 100644 --- a/Heimdallr/Core/OAuthAccessTokenParser.swift +++ b/Heimdallr/Core/OAuthAccessTokenParser.swift @@ -2,6 +2,6 @@ import Foundation import Result /// An access token parser that can be used by Heimdallr. -public protocol OAuthAccessTokenParser { - func parse(data: NSData) -> Result +@objc public protocol OAuthAccessTokenParser { + func parse(data: NSData) throws -> OAuthAccessToken } diff --git a/HeimdallrTests/Core/HeimdallrSpec.swift b/HeimdallrTests/Core/HeimdallrSpec.swift index 90e3c42..bedae80 100644 --- a/HeimdallrTests/Core/HeimdallrSpec.swift +++ b/HeimdallrTests/Core/HeimdallrSpec.swift @@ -43,20 +43,20 @@ class OAuthAccessTokenInterceptorParser: OAuthAccessTokenParser { interceptError = error } - func parse(data: NSData) -> Result { + @objc func parse(data: NSData) throws -> OAuthAccessToken { timesCalled += 1 if self.shouldIntercept { if let accessToken = self.interceptToken { - return .Success(accessToken) + return accessToken } else if let error = self.interceptError { - return .Failure(error) + throw error } else { fatalError("Missing intercept token or error") } } else { - return defaultParser.parse(data) + return try defaultParser.parse(data) } }