Coverage Summary for Class: MindboxErrorAdapter (cloud.mindbox.mobile_sdk.models)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| MindboxErrorAdapter |
80%
(4/5)
|
64.7%
(22/34)
|
95.2%
(40/42)
|
93.2%
(300/322)
|
| MindboxErrorAdapter$gson$2 |
100%
(1/1)
|
|
100%
(1/1)
|
100%
(3/3)
|
| MindboxErrorAdapter$read$1$1 |
100%
(1/1)
|
0%
(0/30)
|
6.5%
(2/31)
|
4.7%
(10/211)
|
| MindboxErrorAdapter$validationErrors$1 |
0%
(0/1)
|
|
0%
(0/3)
|
0%
(0/14)
|
| MindboxErrorAdapter$validationErrors$1$1 |
0%
(0/1)
|
|
0%
(0/1)
|
0%
(0/2)
|
| Total |
66.7%
(6/9)
|
34.4%
(22/64)
|
55.1%
(43/78)
|
56.7%
(313/552)
|
package cloud.mindbox.mobile_sdk.models
import cloud.mindbox.mobile_sdk.utils.LoggingExceptionHandler
import com.google.gson.Gson
import com.google.gson.TypeAdapter
import com.google.gson.reflect.TypeToken
import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonToken
import com.google.gson.stream.JsonWriter
internal class MindboxErrorAdapter : TypeAdapter<MindboxError?>() {
private val gson by lazy { Gson() }
private val errorJsonNames = mapOf(
MindboxError.Validation::class to "MindboxError",
MindboxError.Protocol::class to "MindboxError",
MindboxError.InternalServer::class to "MindboxError",
MindboxError.UnknownServer::class to "NetworkError",
MindboxError.Unknown::class to "InternalError",
)
override fun write(out: JsonWriter?, value: MindboxError?) {
if (value == null) {
out?.nullValue()
} else {
out?.beginObject()
?.name("type")
?.value(errorJsonNames[value::class])
?.name("data")
?.writeErrorObject(value)
?.endObject()
}
}
override fun read(`in`: JsonReader?): MindboxError? = `in`?.let { reader ->
LoggingExceptionHandler.runCatching(defaultValue = null) {
reader.beginObject()
val error = when (reader.nextString()) {
"MindboxError" -> {
val statusCode = reader.nextInt()
when (statusCode) {
200 -> MindboxError.Validation(
statusCode = reader.nextInt(),
status = reader.nextString(),
validationMessages = validationErrors(reader),
)
400, 401, 403, 429 -> MindboxError.Protocol(
statusCode = reader.nextInt(),
status = reader.nextString(),
errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
)
500, 503 -> MindboxError.InternalServer(
statusCode = reader.nextInt(),
status = reader.nextString(),
errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
)
else -> null
}
}
"NetworkError" -> MindboxError.UnknownServer(
statusCode = reader.nextInt(),
status = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
errorMessage = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
errorId = if (reader.peek() == JsonToken.STRING) reader.nextString() else null,
httpStatusCode = if (reader.peek() == JsonToken.NUMBER) reader.nextInt() else null,
)
"InternalError" -> MindboxError.Unknown().apply { reader.skipValue() }
else -> null
}
reader.endObject()
error
}
}
private fun validationErrors(
reader: JsonReader
): List<ValidationMessage> = LoggingExceptionHandler.runCatching(defaultValue = listOf()) {
gson.fromJson<List<ValidationMessage>>(
reader,
object : TypeToken<List<ValidationMessage>>() {}.type,
)
}
private fun JsonWriter.writeErrorObject(value: MindboxError) = beginObject().apply {
when (value) {
is MindboxError.Validation -> name("statusCode").value(value.statusCode)
.name("status").value(value.status)
.name("validationMessages").jsonValue(gson.toJson(value.validationMessages))
is MindboxError.Protocol -> name("statusCode").value(value.statusCode)
.name("status").value(value.status)
.name("errorMessage").value(value.errorMessage)
.name("errorId").value(value.errorId)
.name("httpStatusCode").value(value.httpStatusCode)
is MindboxError.InternalServer -> name("statusCode").value(value.statusCode)
.name("status").value(value.status)
.name("errorMessage").value(value.errorMessage)
.name("errorId").value(value.errorId)
.name("httpStatusCode").value(value.httpStatusCode)
is MindboxError.UnknownServer -> name("statusCode").value(value.statusCode)
.name("status").value(value.status)
.name("errorMessage").value(value.errorMessage)
.name("errorId").value(value.errorId)
.name("httpStatusCode").value(value.httpStatusCode)
is MindboxError.Unknown -> name("errorName").value(value.throwable?.javaClass?.canonicalName)
.name("errorMessage").value(value.throwable?.localizedMessage)
}
}.endObject()
}