diff --git a/app/src/main/java/gq/kirmanak/mealient/data/auth/impl/AuthDataSourceImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/auth/impl/AuthDataSourceImpl.kt index 3f6f367..720c9e1 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/auth/impl/AuthDataSourceImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/auth/impl/AuthDataSourceImpl.kt @@ -5,16 +5,14 @@ import gq.kirmanak.mealient.data.auth.AuthService import gq.kirmanak.mealient.data.auth.impl.AuthenticationError.* import gq.kirmanak.mealient.data.impl.ErrorDetail import gq.kirmanak.mealient.data.impl.RetrofitBuilder +import gq.kirmanak.mealient.data.impl.util.decodeErrorBodyOrNull import kotlinx.coroutines.CancellationException import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json -import kotlinx.serialization.json.decodeFromStream import retrofit2.HttpException -import retrofit2.Response import retrofit2.create import timber.log.Timber -import java.io.InputStream import javax.inject.Inject @ExperimentalSerializationApi @@ -22,6 +20,7 @@ class AuthDataSourceImpl @Inject constructor( private val retrofitBuilder: RetrofitBuilder, private val json: Json, ) : AuthDataSource { + override suspend fun authenticate( username: String, password: String, @@ -54,12 +53,4 @@ class AuthDataSourceImpl @Inject constructor( Timber.v("authenticate() returned: $accessToken") return accessToken } - - private inline fun Response.decodeErrorBodyOrNull(): R? = - errorBody()?.byteStream()?.let { json.decodeFromStreamOrNull(it) } - - private inline fun Json.decodeFromStreamOrNull(stream: InputStream): T? = - runCatching { decodeFromStream(stream) } - .onFailure { Timber.e(it, "decodeFromStreamOrNull: can't decode") } - .getOrNull() } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/impl/util/NetworkExtensions.kt b/app/src/main/java/gq/kirmanak/mealient/data/impl/util/NetworkExtensions.kt new file mode 100644 index 0000000..bd276e3 --- /dev/null +++ b/app/src/main/java/gq/kirmanak/mealient/data/impl/util/NetworkExtensions.kt @@ -0,0 +1,19 @@ +package gq.kirmanak.mealient.data.impl.util + +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.decodeFromStream +import retrofit2.Response +import timber.log.Timber +import java.io.InputStream + +@ExperimentalSerializationApi +inline fun Response.decodeErrorBodyOrNull(json: Json): R? = + errorBody()?.byteStream()?.let { json.decodeFromStreamOrNull(it) } + +@ExperimentalSerializationApi +inline fun Json.decodeFromStreamOrNull(stream: InputStream): T? = + runCatching { decodeFromStream(stream) } + .onFailure { Timber.e(it, "decodeFromStreamOrNull: can't decode") } + .getOrNull() +