Skip to content

Instantly share code, notes, and snippets.

View bill350's full-sized avatar

Jean-Charles SORIN bill350

View GitHub Profile
import Foundation
import SwiftyBeaver
// direct access to the logger across the app
let logger = SwiftyBeaver.self
extension SwiftyBeaver {
static func setupConsole() {
let console = ConsoleDestination()
console.levelColor.verbose = "⚪️ "
final class HomeViewController: ViewController {
// Perhaps a UICollectionView here
// Data structures
fileprivate let dataFetcher = HomeDataFetcher()
override func viewDidLoad() {
super.viewDidLoad()
// MARK: - Reloadable
extension HomeViewController: Reloadable {
var hasData: Bool {
return !self.dataFetcher.data.isEmpty
}
func reloadData() {
self.progressView?.hide()
// Simple factory which choose and init a ProgressView subclass according to a type, here "home"
// MARK: - Failable
extension HomeViewController: Failable {
var errorScreenType: ErrorScreen? {
return .home
}
var errorContext: ErrorContext {
return .dataOriented
}
}
class ViewController: UIViewController {
var errorView: ErrorView?
var progressView: ProgressView?
}
// MARK: - ViewController Default implementation
extension Failable where Self: ViewController {
func showError<T: ErrorDisplayable>(_ error: Swift.Error?, errorView: T.Type, _ reloadable: Reloadable) {
self.errorView = errorView.show(fromView: self.view, insets: .zero, animated: true, completion: nil)
if var errorViewRetryable = self.errorView as? ErrorRetryable {
errorViewRetryable.retry = { reloadable.reloadData() }
errorViewRetryable.message = error?.localizedMessage
}
// MARK: - UIViewController Default implementation
extension FailableCore where Self: UIViewController {
func showError(_ error: Swift.Error?) {
let errorMessage = error?.localizedMessage ?? L10n.commonErrorMessage
SwiftMessages.showAlert(title: errorMessage)
}
struct SignIn {
enum Error: Swift.Error, Localizable, Underlying {
case unknown(underlying: Swift.Error?)
case invalidCredentials(underlying: Swift.Error?)
case mailEmpty
case mailIncorrect
case passwordIncorrect
case serviceInconsistency
extension Error {
var localizedMessage: String {
if let error = self as? SignIn.Error { return error.underlying?.localizedMessage ?? error.localizedMessage }
if let error = self as? Network.Error { return error.localizedMessage }
if let error = self as? Store.Error { return error.localizedMessage }
return L10n.commonErrorMessage // Fallback error message
}
var underlying: Swift.Error? {
protocol Localizable {
var localizedMessage: String { get }
}
protocol Underlying {
var underlying: Swift.Error? { get }
}