Avatar
話ずれてたらごめんだけど、TCAのスタイルが好みで、Protocol使わずに注入してます public struct URLRoutingClient<Route> { var request: (Route) async throws -> (Data, URLResponse) let decoder: JSONDecoder public init( request: @escaping (Route) async throws -> (Data, URLResponse), decoder: JSONDecoder = .init() ) { self.request = request self.decoder = decoder } live, noop, failingを用途に応じて差し替える public static func live<R: ParserPrinter>( router: R, session: URLSession = .shared, decoder: JSONDecoder = .init() ) -> Self where R.Input == URLRequestData, R.Output == Route { Self.init( request: { route in let request = try router.request(for: route) return try await session.data(for: request) }, decoder: decoder ) } public static let noop = Self.init(request: { _ in try await Task.never() }) public static var failing: Self { Self { let message = """ Failed to respond to route: \(debugPrint($0)) Use '\(Self.self).override' to supply a default response for this route. """ XCTFail(message) throw UnimplementedEndpoint(message: message) } }