Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-11 12:51:04 +04:00
parent 80ec72c173
commit e8c5c35e56
11 changed files with 89 additions and 44 deletions

View file

@ -33,12 +33,8 @@ internal class ApiResponseCallDelegate<T : Any>(
}
override fun onFailure(call: Call<T>, t: Throwable) {
val e = if (t.isNetworkException()) {
ApiResponseError.NetworkException
} else {
ApiResponseError.UnknownException(t)
}
val safeResponse = apiError<T>(e)
val error = t.toApiError()
val safeResponse = apiError<T>(error)
responseCallback.onResponse(this@ApiResponseCallDelegate, Response.success(safeResponse))
}

View file

@ -73,7 +73,10 @@ sealed class ApiResponseError : Exception() {
}
/** Represents a network error, typically when there's no connectivity. */
object NetworkException : ApiResponseError()
data object NetworkException : ApiResponseError()
/** Represents a timeout error, typically when the server takes too long to respond. */
data object TimeoutException : ApiResponseError()
/**
* Represents an unexpected exception that doesn't fall into one of the other categories.

View file

@ -1,8 +1,11 @@
package com.tangem.datasource.api.common.response
import kotlinx.coroutines.TimeoutCancellationException
import retrofit2.Response
import java.net.ConnectException
import java.net.SocketTimeoutException
import java.net.UnknownHostException
import java.util.concurrent.TimeoutException
import javax.net.ssl.SSLHandshakeException
internal fun <T : Any> Response<T>.toSafeApiResponse(): ApiResponse<T> {
@ -23,10 +26,14 @@ internal fun <T : Any> Response<T>.toSafeApiResponse(): ApiResponse<T> {
}
}
internal fun Throwable.isNetworkException(): Boolean = when (this) {
internal fun Throwable.toApiError(): ApiResponseError = when (this) {
is ConnectException,
is UnknownHostException,
is SSLHandshakeException,
-> true
else -> false
-> ApiResponseError.NetworkException
is TimeoutException,
is TimeoutCancellationException,
is SocketTimeoutException,
-> ApiResponseError.TimeoutException
else -> ApiResponseError.UnknownException(cause = this)
}