// // NetworkService.swift // // // Created by Juraldinio on 04.08.2022. // import Foundation import Alamofire public struct NetworkStaticAPIRecord { public typealias Headers = [String: String] public let url: URL public let headers: Headers? public init(url: URL, headers: Headers?) { self.url = url self.headers = headers } var httpHeaders: HTTPHeaders? { guard let headers = self.headers else { return nil } return HTTPHeaders(headers.compactMap { key, value in HTTPHeader(name: key, value: value) }) } } public struct NetworkDynamicAPIRecord { public typealias Headers = [String: String] public typealias Dynamic = () -> URL public let url: Dynamic public let headers: Headers? public init(url: @escaping Dynamic, headers: Headers?) { self.url = url self.headers = headers } var httpHeaders: HTTPHeaders? { guard let headers = self.headers else { return nil } return HTTPHeaders(headers.compactMap { key, value in HTTPHeader(name: key, value: value) }) } } public protocol NetworkEnvironment { var configuration: URLSessionConfiguration? { get } var usernames: NetworkStaticAPIRecord { get } var backend: NetworkStaticAPIRecord { get } var hyperion: NetworkDynamicAPIRecord { get } var node: NetworkDynamicAPIRecord { get } func isEquals(other: NetworkEnvironment) -> Bool } public protocol NetworkService { init(environment: NetworkEnvironment) } public enum NetworkServiceError: Error { case invalidUrl case gqlSystem([String]) case gqlApplication(String) case gqlDecode(String) case uncatched } // MARK: - Equatable extension NetworkEnvironment { public func isEquals(other: NetworkEnvironment) -> Bool { return self.configuration == other.configuration && self.usernames.url == other.usernames.url && self.usernames.headers == other.usernames.headers && self.backend.url == other.backend.url && self.backend.headers == other.backend.headers && self.hyperion.url() == other.hyperion.url() && self.hyperion.headers == other.hyperion.headers && self.node.url() == other.node.url() && self.node.headers == other.node.headers } }