97 lines
2.9 KiB
Swift
97 lines
2.9 KiB
Swift
//
|
||
// AccountError.swift
|
||
// NetNewsWire
|
||
//
|
||
// Created by Maurice Parker on 5/26/19.
|
||
// Copyright © 2019 Ranchero Software, LLC. All rights reserved.
|
||
//
|
||
|
||
import Foundation
|
||
import RSWeb
|
||
|
||
public enum AccountError: LocalizedError {
|
||
|
||
case createErrorNotFound
|
||
case createErrorAlreadySubscribed
|
||
case opmlImportInProgress
|
||
case wrappedError(error: Error, account: Account)
|
||
|
||
public var acount: Account? {
|
||
if case .wrappedError(_, let account) = self {
|
||
return account
|
||
} else {
|
||
return nil
|
||
}
|
||
}
|
||
|
||
public var isCredentialsError: Bool {
|
||
if case .wrappedError(let error, _) = self {
|
||
if case TransportError.httpError(let status) = error {
|
||
return isCredentialsError(status: status)
|
||
}
|
||
}
|
||
return false
|
||
}
|
||
|
||
public var errorDescription: String? {
|
||
switch self {
|
||
case .createErrorNotFound:
|
||
return NSLocalizedString("The feed couldn’t be found and can’t be added.", comment: "Not found")
|
||
case .createErrorAlreadySubscribed:
|
||
return NSLocalizedString("You are already subscribed to this feed and can’t add it again.", comment: "Already subscribed")
|
||
case .opmlImportInProgress:
|
||
return NSLocalizedString("An OPML import for this account is already running.", comment: "Import running")
|
||
case .wrappedError(let error, let account):
|
||
switch error {
|
||
case TransportError.httpError(let status):
|
||
if isCredentialsError(status: status) {
|
||
let localizedText = NSLocalizedString("Your “%@” credentials are invalid or expired.", comment: "Invalid or expired")
|
||
return NSString.localizedStringWithFormat(localizedText as NSString, account.nameForDisplay) as String
|
||
} else {
|
||
return unknownError(error, account)
|
||
}
|
||
default:
|
||
return unknownError(error, account)
|
||
}
|
||
}
|
||
}
|
||
|
||
public var recoverySuggestion: String? {
|
||
switch self {
|
||
case .createErrorNotFound:
|
||
return nil
|
||
case .createErrorAlreadySubscribed:
|
||
return nil
|
||
case .wrappedError(let error, _):
|
||
switch error {
|
||
case TransportError.httpError(let status):
|
||
if isCredentialsError(status: status) {
|
||
return NSLocalizedString("Please update your credentials for this account, or ensure that your account with this service is still valid.", comment: "Expired credentials")
|
||
} else {
|
||
return NSLocalizedString("Please try again later.", comment: "Try later")
|
||
}
|
||
default:
|
||
return NSLocalizedString("Please try again later.", comment: "Try later")
|
||
}
|
||
default:
|
||
return NSLocalizedString("Please try again later.", comment: "Try later")
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
// MARK: Private
|
||
|
||
private extension AccountError {
|
||
|
||
func unknownError(_ error: Error, _ account: Account) -> String {
|
||
let localizedText = NSLocalizedString("An error occurred while processing the “%@” account: %@", comment: "Unknown error")
|
||
return NSString.localizedStringWithFormat(localizedText as NSString, account.nameForDisplay, error.localizedDescription) as String
|
||
}
|
||
|
||
func isCredentialsError(status: Int) -> Bool {
|
||
return status == 401 || status == 403
|
||
}
|
||
|
||
}
|