import Foundation import RxSwift #if !COCOAPODS import Moya #endif extension MoyaProvider: ReactiveCompatible {} public extension Reactive where Base: MoyaProviderType { /// Designated request-making method. /// /// - Parameters: /// - token: Entity, which provides specifications necessary for a `MoyaProvider`. /// - callbackQueue: Callback queue. If nil - queue from provider initializer will be used. /// - Returns: Single response object. func request(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Single { return Single.create { [weak base] single in let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: nil) { result in switch result { case let .success(response): single(.success(response)) case let .failure(error): single(.error(error)) } } return Disposables.create { cancellableToken?.cancel() } } } /// Designated request-making method with progress. func requestWithProgress(_ token: Base.Target, callbackQueue: DispatchQueue? = nil) -> Observable { let progressBlock: (AnyObserver) -> (ProgressResponse) -> Void = { observer in return { progress in observer.onNext(progress) } } let response: Observable = Observable.create { [weak base] observer in let cancellableToken = base?.request(token, callbackQueue: callbackQueue, progress: progressBlock(observer)) { result in switch result { case .success: observer.onCompleted() case let .failure(error): observer.onError(error) } } return Disposables.create { cancellableToken?.cancel() } } // Accumulate all progress and combine them when the result comes return response.scan(ProgressResponse()) { last, progress in let progressObject = progress.progressObject ?? last.progressObject let response = progress.response ?? last.response return ProgressResponse(progress: progressObject, response: response) } } }