Вам нужно сделать свою функцию:
- Расширение типа, для которого вы хотите, чтобы он вызывался.
- сделать последним параметром transform, чтобы использовать его вне фигурных скобок (рекомендуется в чистая архитектура, не требуется).
Вы можете реализовать свою функцию следующим образом:
inline fun <T, R> Response<T>.safeCall(
errorFactory: FailureFactory = FailureFactory(),
transform: (T) -> R
): Either<ErrorEntity, R> =
when (this.isSuccessful) {
true -> Either.Right(transform(body()!!))
false -> Either.Left(errorFactory.handleCode(code()))
}
Теперь, поскольку ваш safeCall
является расширением Response, теперь вы можете вызывать в ответе:
// response is of type Response<T> where T is Any?
response.safeCall(myErrorFactory) { it.map { msgs-> msgs.toDomain() } }
Редактировать:
Если вы хотите перехватывать исключения, при выполнении вызовов вы можете использовать этот подход:
inline fun <T, R> safeCall(
block: () -> Response<T>,
errorFactory: FailureFactory = FailureFactory(),
transform: (T) -> R
): Either<ErrorEntity, R> = ... // your original function body
Для вызова этой функции:
// myErrorFactory optional
safeCall(service::mylist, myErrorFactory) { it.map { msgs-> msgs.toDomain() } }
safeCall(service::getMessages, myErrorFactory) { it.map { msgs-> msgs.toDomain() } }