Skip to content

Instantly share code, notes, and snippets.

View IsaAliev's full-sized avatar

Isa Aliev IsaAliev

  • Moscow, Russia
View GitHub Profile
import Foundation
final class BaseService<T: Decodable>: Service {
typealias ResultTypeValue = T
var responseHandler: HTTPResponseHandler<T>? = HTTPResponseHandler<T>()
var request: HTTPRequestRepresentable?
var successHandler: SuccessHandlerBlock?
var failureHandler: FailureHandlerBlock?
import Foundation
class HTTPResponseHandler<T: Decodable>: ResponseHandler {
typealias ResultValueType = T
private var isResponseRepresentSimpleType: Bool {
return
T.self == Int.self ||
T.self == String.self ||
T.self == Double.self ||
import Foundation
struct BaseErrorHandler: ErrorHandler {
var errorCodeHandler: ErrorCodeHandler = BaseErrorCodeHandler()
var errorCodeGetter: ErrorCodeGetter = BaseErrorCodeGetter()
var errorMessageGetter: ErrorMessageGetter = BaseErrorMessageGetter()
func handleErrorResponse(_ response: ResponseRepresentable, completion: (ErrorRepresentable) -> ()) {
guard let httpResponse = response.response as? HTTPURLResponse else {
return
import Foundation
struct GitHubRepo: Decodable {
var id: Int
var name: String
var `private`: Bool
var description: String
var url: URL
var hasIssues: Bool
protocol APIBuilder {
associatedtype ResultType: Decodable
func buildAPI(for request: HTTPRequestRepresentable,
decodingProcessor: ModelDecodingProcessor<ResultType>?,
nestedModelGetter: NestedModelGetter?) -> BaseService<ResultType>
}
import Foundation
class GitHubAPIBuilder<T: Decodable>: APIBuilder {
typealias ResultType = T
func buildAPI(for request: HTTPRequestRepresentable,
decodingProcessor: ModelDecodingProcessor<T>? = nil,
nestedModelGetter: NestedModelGetter? = nil) -> BaseService<T> {
let service = BaseService<T>()
service.request = request
import Foundation
protocol ReposGettable {
func getRepos(completion: @escaping ([GitHubRepo]) -> ())
}
import Foundation
class ReposAPI: ReposGettable {
lazy var getReposService: BaseService<[GitHubRepo]> = {
let apiBuilder = GitHubAPIBuilder<[GitHubRepo]>()
return apiBuilder.buildAPI(for: GETReposRequest())
}()
func getRepos(completion: @escaping ([GitHubRepo]) -> ()) {
import UIKit
class ViewController: UIViewController {
let ghReposService: ReposGettable = ReposAPI()
override func viewDidLoad() {
super.viewDidLoad()
ghReposService.getRepos { (repos) in
print(repos)
import Foundation
protocol GitHubUsersAPI {
func getLocationFor(_ user: String, completion: @escaping (String) -> ())
}