All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jvmMain.retrofit.NetworkResponseCallAdapterFactory.kt Maven / Gradle / Ivy

The newest version!
package com.javiersc.resources.networkResponse.retrofit

import com.javiersc.resources.networkResponse.NetworkResponse
import com.javiersc.resources.networkResponse.retrofit.deferred.NetworkResponseDeferredCallAdapter
import com.javiersc.resources.networkResponse.retrofit.suspend.NetworkResponseSuspendCallAdapter
import kotlinx.coroutines.Deferred
import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

public class NetworkResponseCallAdapterFactory : CallAdapter.Factory() {

    override fun get(
        returnType: Type,
        annotations: Array,
        retrofit: Retrofit
    ): CallAdapter<*, *>? {
        check(returnType is ParameterizedType) { "$returnType must be parameterized. Raw types are not supported" }

        val containerType = getParameterUpperBound(0, returnType)
        if (getRawType(containerType) != NetworkResponse::class.java) return null

        check(containerType is ParameterizedType) {
            "$containerType must be parameterized. Raw types are not supported"
        }

        val (successBodyType, errorBodyType) = containerType.getBodyTypes()
        val errorBodyConverter = retrofit.nextResponseBodyConverter(null, errorBodyType, annotations)

        return when (getRawType(returnType)) {
            Deferred::class.java -> NetworkResponseDeferredCallAdapter(successBodyType, errorBodyConverter)
            Call::class.java -> NetworkResponseSuspendCallAdapter(successBodyType, errorBodyConverter)
            else -> null
        }
    }

    private fun ParameterizedType.getBodyTypes(): Pair {
        val successType = getParameterUpperBound(0, this)
        val errorType = getParameterUpperBound(1, this)
        return successType to errorType
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy