Tower Guidev2
08/03/2022, 2:25 PMTower Guidev2
08/03/2022, 2:26 PMapi platform("io.arrow-kt:arrow-stack:1.1.3-alpha.37")
api "io.arrow-kt:arrow-core"
api 'io.arrow-kt:arrow-core-retrofit'
and have the following to test out both Either
and ResponseE
Tower Guidev2
08/03/2022, 2:27 PMinterface DiscogsDataApi {
suspend fun searchE(accessToken: String = ACCESS_TOKEN, options: Map<String, String>): ResponseE<NetworkException, Response<SearchResponse>>
suspend fun search(accessToken: String = ACCESS_TOKEN, options: Map<String, String>): Either<NetworkException, Response<SearchResponse>>
}
interface DiscogsApi {
@GET("database/search")
suspend fun search(@Header(HEADER_AUTHORISATION) accessToken: String, @QueryMap options: Map<String, String>): Response<SearchResponse>
@GET("database/search")
suspend fun searchE(@Header(HEADER_AUTHORISATION) accessToken: String, @QueryMap options: Map<String, String>): ResponseE<NetworkException, Response<SearchResponse>>
}
Tower Guidev2
08/03/2022, 2:29 PMclass DiscogsRepository @Inject constructor(private val service: DiscogsApi) : DiscogsDataApi {
override suspend fun searchE(accessToken: String, options: Map<String, String>): ResponseE<NetworkException, Response<SearchResponse>> = service.searchE(accessToken, options)
override suspend fun search(accessToken: String, options: Map<String, String>): Either<NetworkException, Response<SearchResponse>> = withContext(NETWORK) {
Either.catch { service.search(accessToken, options) }.mapLeft { unknown -> unknown.mapNetworkException() }
}
}
Tower Guidev2
08/03/2022, 2:30 PMsearch
works fine as shown here
override suspend fun doActualWork(): Result {
val work: Either<DatasourceException, *> = either {
val response = repository.search(options = mapOf("q" to "Nirvana")).bind()
persistResponse(response).bind()
}
return work.fold(ifLeft = { Result.failure() }, ifRight = { Result.success() })
}
private suspend fun persistResponse(response: Response<SearchResponse>): Either<DatasourceException, Long> =
Either.conditionally(
isHttpResponseOK(response),
{ manageHTTPError(response).run { NetworkException() } },
{
1L
}
)
Tower Guidev2
08/03/2022, 2:31 PMsearchE
fails with...Tower Guidev2
08/03/2022, 2:32 PMjava.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: Unable to create converter for retrofit2.Response<com.common.shared.resource.model.network.SearchResponse>
for method DiscogsApi.searchE
Tower Guidev2
08/03/2022, 2:32 PMCaused by: kotlinx.serialization.SerializationException: Serializer for class 'Response' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
stojan
08/03/2022, 2:56 PMsuspend fun searchE(accessToken: String = ACCESS_TOKEN, options: Map<String, String>): ResponseE<NetworkException, SearchResponse>