Используйте Either для ответа retrofit2 - PullRequest
0 голосов
/ 19 октября 2019

Я создал такой класс:

sealed class Either<out L, out R> {
    //Failure
    data class Left<out L>(val value: L) : Either<L, Nothing>()

    //Success
    data class Right<out R>(val value: R) : Either<Nothing, R>()

    val isRight get() = this is Right<R>
    val isLeft get() = this is Left<L>
}

Я использую модификацию и планирую вернуть:

@GET(__SOMEPATH__)
suspend fun pews(__Whatever__) : Either<Throwable, POJO>

Но когда Gson пытается создатьобъект, исключение выдается:

java.lang.RuntimeException: не удалось вызвать закрытый com.pew.pew.base.networking.Either () без аргументов

А также

Caused by: java.lang.InstantiationException: Can't instantiate abstract class com.pew.pew.base.networking.Either

Есть ли способ инкапсулировать Error и Result в ответ на модификацию?

EDIT

Теперь у меня есть другой запечатанныйclass

sealed class Result<T> {
  data class Success<T>(val data: T) : Result<T>()
  data class Unauthorized(val exception: Exception) : Result<Nothing>()
  data class Timeout(val exception: Exception) : Result<Nothing>()
  data class Error(val exception: Exception) : Result<Nothing>()
}
​
fun <A, B> Result<A>.map(mapper: (A) -> B): Result<out B> {
  return when (this) {
    is Success -> Success(mapper(data))
    is Unauthorized -> Unauthorized(exception)
    is Timeout -> Timeout(exception)
    is Error -> Error(exception)
  }
}

И затем в моем RepositoryImpl мне нужно определить, является ли это успехом или ошибкой. Как мне это сделать? До того, как я использовал фолд, это позволило мне получить успех или ошибку.

Могу ли я сделать что-то вроде изменения с Call<T> на Result<T>?

inline fun <reified T> execute(f: () -> Call<T>): ResultWrapper<T> =
        try {
            when (T::class) {
                Unit::class -> f().execute().let {
                    ResultWrapper.Success(Unit as T)
                }
                else -> f().execute().body()?.let {
                    ResultWrapper.Success(it)
                } ?: ResultWrapper.Error(Throwable())
            }
        } catch (exception: Exception) {
            ResultWrapper.Network(serverError)
        } 

Но там написано enter image description here

...