Tweak Response.parseAs() to utilize intrinsics (#9047)

(cherry picked from commit 0d8f1c8560c5d65712d1656856ab33b6de0adb09)

# Conflicts:
#	core/src/main/java/eu/kanade/tachiyomi/network/OkHttpExtensions.kt
This commit is contained in:
stevenyomi 2023-02-08 11:10:28 +08:00 committed by Jobobby04
parent 637448eb65
commit bbbd34a8de

View File

@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.network
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.ExperimentalSerializationApi import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import kotlinx.serialization.json.okio.decodeFromBufferedSource import kotlinx.serialization.json.okio.decodeFromBufferedSource
import kotlinx.serialization.serializer import kotlinx.serialization.serializer
@ -21,8 +21,6 @@ import uy.kohesive.injekt.api.get
import java.io.IOException import java.io.IOException
import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicBoolean
import kotlin.coroutines.resumeWithException import kotlin.coroutines.resumeWithException
import kotlin.reflect.KType
import kotlin.reflect.typeOf
val jsonMime = "application/json; charset=utf-8".toMediaType() val jsonMime = "application/json; charset=utf-8".toMediaType()
@ -134,13 +132,11 @@ fun OkHttpClient.newCachelessCallWithProgress(request: Request, listener: Progre
} }
inline fun <reified T> Response.parseAs(/* SY --> */json: Json = Injekt.get()/* SY <-- */): T { inline fun <reified T> Response.parseAs(/* SY --> */json: Json = Injekt.get()/* SY <-- */): T {
return internalParseAs(typeOf<T>(), this, /* SY --> */ json /* SY <-- */) return decodeFromJsonResponse(serializer(), this, /* SY --> */ json /* SY <-- */)
} }
@Suppress("UNCHECKED_CAST")
@OptIn(ExperimentalSerializationApi::class) @OptIn(ExperimentalSerializationApi::class)
fun <T> internalParseAs(type: KType, response: Response, /* SY --> */ json: Json /* SY <-- */): T { fun <T> decodeFromJsonResponse(deserializer: DeserializationStrategy<T>, response: Response, /* SY --> */ json: Json /* SY <-- */): T {
val deserializer = serializer(type) as KSerializer<T>
return response.body.source().use { return response.body.source().use {
json.decodeFromBufferedSource(deserializer, it) json.decodeFromBufferedSource(deserializer, it)
} }