Files
SwiftUI/Other Projects/GitHub Search/GitHubSearchWithSwiftUI/Extension/URLSession.Combine.swift
John Holdsworth 8018d0c2a0 Combine examples
2019-07-10 00:57:54 +01:00

41 lines
1.1 KiB
Swift
Executable File

//
// 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<Data, URLSessionError> {
base.dataTaskPublisher(for: request)
.mapError { URLSessionError.urlError($0) }
.flatMap { data, response -> AnyPublisher<Data, URLSessionError> 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)
}