/* * Copyright (C) 2020 Conny Duck * * This file is part of Pixelcat. * * Pixelcat is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Pixelcat is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ package at.connyduck.pixelcat.network.calladapter import retrofit2.Call import retrofit2.CallAdapter import retrofit2.Retrofit import java.lang.reflect.ParameterizedType import java.lang.reflect.Type class NetworkResponseAdapterFactory : CallAdapter.Factory() { override fun get( returnType: Type, annotations: Array, retrofit: Retrofit ): CallAdapter<*, *>? { // suspend functions wrap the response type in `Call` if (Call::class.java != getRawType(returnType)) { return null } // check first that the return type is `ParameterizedType` check(returnType is ParameterizedType) { "return type must be parameterized as Call> or Call>" } // get the response type inside the `Call` type val responseType = getParameterUpperBound(0, returnType) // if the response type is not ApiResponse then we can't handle this type, so we return null if (getRawType(responseType) != NetworkResponse::class.java) { return null } // the response type is ApiResponse and should be parameterized check(responseType is ParameterizedType) { "Response must be parameterized as NetworkResponse or NetworkResponse" } val successBodyType = getParameterUpperBound(0, responseType) return NetworkCallAdapter(successBodyType) } }