jsdw_ios/QuickLocation/API/RxMoya/Single+Response.swift

54 lines
2.3 KiB
Swift

import Foundation
import RxSwift
import Moya
#if canImport(UIKit)
import UIKit.UIImage
#elseif canImport(AppKit)
import AppKit.NSImage
#endif
/// Extension for processing raw NSData generated by network access.
public extension PrimitiveSequence where Trait == SingleTrait, Element == Response {
/// Filters out responses that don't fall within the given closed range, generating errors when others are encountered.
func filter<R: RangeExpression>(statusCodes: R) -> Single<Element> where R.Bound == Int {
return flatMap { .just(try $0.filter(statusCodes: statusCodes)) }
}
/// Filters out responses that have the specified `statusCode`.
func filter(statusCode: Int) -> Single<Element> {
return flatMap { .just(try $0.filter(statusCode: statusCode)) }
}
/// Filters out responses where `statusCode` falls within the range 200 - 299.
func filterSuccessfulStatusCodes() -> Single<Element> {
return flatMap { .just(try $0.filterSuccessfulStatusCodes()) }
}
/// Filters out responses where `statusCode` falls within the range 200 - 399
func filterSuccessfulStatusAndRedirectCodes() -> Single<Element> {
return flatMap { .just(try $0.filterSuccessfulStatusAndRedirectCodes()) }
}
/// Maps data received from the signal into an Image. If the conversion fails, the signal errors.
func mapImage() -> Single<Image> {
return flatMap { .just(try $0.mapImage()) }
}
/// Maps data received from the signal into a JSON object. If the conversion fails, the signal errors.
func mapJSON(failsOnEmptyData: Bool = true) -> Single<Any> {
return flatMap { .just(try $0.mapJSON(failsOnEmptyData: failsOnEmptyData)) }
}
/// Maps received data at key path into a String. If the conversion fails, the signal errors.
func mapString(atKeyPath keyPath: String? = nil) -> Single<String> {
return flatMap { .just(try $0.mapString(atKeyPath: keyPath)) }
}
/// Maps received data at key path into a Decodable object. If the conversion fails, the signal errors.
func map<D: Decodable>(_ type: D.Type, atKeyPath keyPath: String? = nil, using decoder: JSONDecoder = JSONDecoder(), failsOnEmptyData: Bool = true) -> Single<D> {
return flatMap { .just(try $0.map(type, atKeyPath: keyPath, using: decoder, failsOnEmptyData: failsOnEmptyData)) }
}
}