|
public class RxJava2ErrorAdapter<R> implements CallAdapter<R, Object> { |
|
|
|
private ErrorConverter errorConverter; |
|
private CallAdapter<R, Object> wrapped; |
|
|
|
public RxJava2ErrorAdapter(ErrorConverter errorConverter, CallAdapter<R, Object> wrapped) { |
|
this.errorConverter = errorConverter; |
|
this.wrapped = wrapped; |
|
} |
|
|
|
@Override |
|
public Type responseType() { |
|
return wrapped.responseType(); |
|
} |
|
|
|
@Override |
|
public Object adapt(Call<R> call) { |
|
Object result = wrapped.adapt(call); |
|
if (result instanceof Observable) { |
|
return ((Observable) result).onErrorResumeNext(new Function<Throwable, ObservableSource>() { |
|
@Override |
|
public ObservableSource apply(@NonNull Throwable throwable) throws Exception { |
|
return Observable.error(tryConvertException(throwable)); |
|
}}); |
|
|
|
} |
|
if (result instanceof Single) { |
|
return ((Single) result).onErrorResumeNext(new Function<Throwable, SingleSource>() { |
|
@Override |
|
public SingleSource apply(@NonNull Throwable throwable) throws Exception { |
|
return Single.error(tryConvertException(throwable)); |
|
} |
|
}); |
|
} |
|
if (result instanceof Maybe) { |
|
return ((Maybe) result).onErrorResumeNext(new Function<Throwable, MaybeSource>() { |
|
@Override |
|
public MaybeSource apply(@NonNull Throwable throwable) throws Exception { |
|
return Maybe.error(tryConvertException(throwable)); |
|
} |
|
}); |
|
} |
|
if (result instanceof Flowable) { |
|
return ((Flowable) result).onErrorResumeNext(new Function<Throwable, Publisher>() { |
|
@Override |
|
public Publisher apply(@NonNull Throwable throwable) throws Exception { |
|
return Flowable.error(tryConvertException(throwable)); |
|
} |
|
}); |
|
} |
|
if (result instanceof Completable) { |
|
return ((Completable) result).onErrorResumeNext(new Function<Throwable, CompletableSource>() { |
|
@Override |
|
public CompletableSource apply(@NonNull Throwable throwable) throws Exception { |
|
return Completable.error(tryConvertException(throwable)); |
|
} |
|
}); |
|
} |
|
throw new IllegalStateException("call is not instance of observable, but: " + result.getClass().getName()); |
|
|
|
} |
|
|
|
@NonNull |
|
private Throwable tryConvertException(Throwable throwable) { |
|
if (throwable instanceof HttpException && errorConverter != null) { |
|
return errorConverter.processServerError((HttpException) throwable); |
|
} |
|
return throwable; |
|
} |
|
} |