import Bindings public struct RestlikeRequestSender { public var send: (Int, Int, Data) throws -> Data public func callAsFunction( clientId: Int, connectionId: Int, request: Data ) throws -> Data { try send(clientId, connectionId, request) } } extension RestlikeRequestSender { public static func live(authenticated: Bool) -> RestlikeRequestSender { RestlikeRequestSender { clientId, connectionId, request in var error: NSError? let response: Data? if authenticated { response = BindingsRestlikeRequestAuth(clientId, connectionId, request, &error) } else { response = BindingsRestlikeRequest(clientId, connectionId, request, &error) } if let error = error { throw error } guard let response = response else { let functionName = "BindingsRestlikeRequest\(authenticated ? "Auth" : "")" fatalError("\(functionName) returned `nil` without providing error") } return response } } } #if DEBUG extension RestlikeRequestSender { public static let failing = RestlikeRequestSender { _, _, _ in struct NotImplemented: Error {} throw NotImplemented() } } #endif