Colton Idle
09/01/2023, 6:03 PM{ "status: "success", "data": { } }
and 200 for failures
{
"status": "error",
"message": "Please try again."
}
I can't seem to figure out the syntax needed for this converter factory (code in thread)🧵Colton Idle
09/01/2023, 6:06 PMclass ErrorConverterFactory : Converter.Factory() {
override fun responseBodyConverter(
type: Type,
annotations: Array<out Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *>? {
val (errorType, nextAnnotations) = annotations.errorType() ?: return null
return ResponseBodyConverter(errorType.toType())
}
class ResponseBodyConverter(
private val errorType: Type
) : Converter<ResponseBody, *> {
override fun convert(value: ResponseBody): String {
if (value.string().contains("error")) { // todo: only inspect "status" property
val errorResponse = MyErrorType("asd")
throw ApiException(errorResponse)
} else {
return //how do i delegate to the regular Success type?
}
}
}
}
Colton Idle
09/01/2023, 6:12 PMdata class SuccessResponse<T>(val status: String, val data: T)
data class FailureResponse(val status: String, val message: String)
Colton Idle
09/01/2023, 6:13 PM@DecodeErrorBody
@GET("/test2")
suspend fun test1(): ApiResult<SuccessResponse<Test1Response>, FailureResponse>
@DecodeErrorBody
@GET("/test1")
suspend fun test2(): ApiResult<SuccessResponse<Test2Response>, FailureResponse>
Javier
09/01/2023, 6:18 PMColton Idle
09/01/2023, 6:19 PMJavier
09/01/2023, 6:21 PMColton Idle
09/01/2023, 6:26 PMJavier
09/01/2023, 6:27 PMinternal fun <F : Any, S : Any> handleSuspend(
call: NetworkEitherSuspendCall<F, S>,
callback: Callback<NetworkEither<F, S>>,
code: Int,
body: S?,
errorBody: F?,
headers: Headers,
) =
with(callback) {
when (code) {
in 200..299 -> {
if (body != null) onResponse(call, Response.success(NetworkEither.success(body, code, headers)))
else handleNullBody(callback, call, code, headers)
}
in 400..599 -> {
if (errorBody != null) onResponse(call, Response.success(NetworkEither.httpFailure(errorBody, code, headers)))
else handleNullErrorBody(callback, call)
}
}
}
Everything is sent as Response.success
, but you can use your custom Either
, in my NetworkEither.success
or NetworkEither.httpFailure
, based on the status codeColton Idle
09/01/2023, 6:53 PMJavier
09/01/2023, 6:58 PMConverter<ResponseBody, F>
Colton Idle
09/02/2023, 6:42 PMjulioromano
02/17/2024, 3:54 PMJavier
02/17/2024, 4:18 PMZac Sweers
02/17/2024, 8:13 PMZac Sweers
02/17/2024, 8:18 PMstatus
key or whatever you want, and then either proceed along the happy path if it's ok or throw an ApiException
. That'll get caught and passed on to a converter for whatever error type you defined on the ApiResult.Zac Sweers
02/17/2024, 8:19 PMjulioromano
02/17/2024, 9:36 PMjulioromano
02/19/2024, 7:31 AMColton Idle
02/19/2024, 6:42 PM