mirror of
https://github.com/ivanvorobei/SwiftUI.git
synced 2026-03-28 12:12:03 +01:00
41 lines
1.1 KiB
Swift
Executable File
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)
|
|
}
|