import Foundation import Apollo extension Result { var value: Success? { do { return try get() } catch { return nil } } var error: Failure? { do { _ = try get();return nil } catch { return error as? Failure } } } extension Network.Service { class GraphQL: Common.Service.Provider { #warning("shared should be removed or init make private") static let shared = GraphQL() private var _client: ApolloClient! private var _paycashClient: ApolloClient! init() { } } } extension Network.Service.GraphQL { @discardableResult func fetch(query: Query, completion: @escaping (Result) -> Void ) -> Cancellable { client.fetch(query: query, cachePolicy: .fetchIgnoringCacheCompletely) { if let data = $0.value?.data { completion(.success(data)) } else if let error = $0.error { completion(.failure(error)) } else { completion(.failure(NSError.error(L10n.Common.Alert.error))) } } } @discardableResult func fetchV2(query: Query, completion: @escaping (Result) -> Void ) -> Cancellable { paycashClient.fetch(query: query, cachePolicy: .fetchIgnoringCacheCompletely) { if let data = $0.value?.data { completion(.success(data)) } else if let error = $0.error { completion(.failure(error)) } else { completion(.failure(NSError.error(L10n.Common.Alert.error))) } } } @discardableResult func perform(mutation: Mutation, completion: ((Result) -> Void)? = nil) -> Cancellable { client.perform(mutation: mutation) { guard let completion = completion else { return } if let data = $0.value?.data { completion(.success(data)) } else if let error = $0.error { completion(.failure(error)) } else { completion(.failure(NSError.error(L10n.Common.Alert.error))) } } } } extension Network.Service.GraphQL { fileprivate var client: ApolloClient { if _client == nil { _client = ApolloClient(url: URL(string: Network.servers.current.graphql)!) } return _client } fileprivate var paycashClient: ApolloClient { if _paycashClient == nil { _paycashClient = ApolloClient(url: URL(string: Network.servers.current.paycashQraphql)!) } return _paycashClient } } //extension Network.Service.GraphQL: HTTPNetworkTransportPreflightDelegate { // func networkTransport(_ networkTransport: HTTPNetworkTransport, shouldSend request: URLRequest) -> Bool { true } // func networkTransport(_ networkTransport: HTTPNetworkTransport, willSend request: inout URLRequest) {} //} //