// // URLSession.Combine.swift // GitHubSearchWithSwiftUI // // Created by marty-suzuki on 2019/06/05. // Copyright © 2019 jp.marty-suzuki. All rights reserved. // import Combine import Foundation extension URLSession: CombineCompatible {} extension CombineExtension where Base == URLSession { func send(request: URLRequest) -> AnyPublisher { base.dataTaskPublisher(for: request) .mapError { URLSessionError.urlError($0) } .flatMap { data, response -> AnyPublisher in guard let response = response as? HTTPURLResponse else { return .fail(.invalidResponse) } guard 200..<300 ~= response.statusCode else { return .fail(.serverErrorMessage(statusCode: response.statusCode, data: data)) } return .just(data) } .eraseToAnyPublisher() } } enum URLSessionError: Error { case invalidResponse case serverErrorMessage(statusCode: Int, data: Data) case urlError(URLError) }