From 4aa9f2ae73a74a7729a429a8994b3752b1d92960 Mon Sep 17 00:00:00 2001 From: Franciszek Job <54181625+franciszekjob@users.noreply.github.com> Date: Thu, 13 Jun 2024 17:27:42 +0200 Subject: [PATCH] Add `RequestResult` type (#478) --- .../starknet/data/types/RequestResult.kt | 21 +++++++++++++++++++ .../provider/rpc/BuildJsonHttpDeserializer.kt | 17 ++++++++------- .../service/http/requests/HttpBatchRequest.kt | 9 ++++---- 3 files changed, 35 insertions(+), 12 deletions(-) create mode 100644 lib/src/main/kotlin/com/swmansion/starknet/data/types/RequestResult.kt diff --git a/lib/src/main/kotlin/com/swmansion/starknet/data/types/RequestResult.kt b/lib/src/main/kotlin/com/swmansion/starknet/data/types/RequestResult.kt new file mode 100644 index 000000000..1a37b248d --- /dev/null +++ b/lib/src/main/kotlin/com/swmansion/starknet/data/types/RequestResult.kt @@ -0,0 +1,21 @@ +package com.swmansion.starknet.data.types + +data class RequestResult(val result: Result) { + companion object { + fun success(value: T) = RequestResult(Result.success(value)) + + fun failure(throwable: Throwable): RequestResult = RequestResult(Result.failure(throwable)) + } + + val isSuccess: Boolean + get() = result.isSuccess + + val isFailure: Boolean + get() = result.isFailure + + fun getOrNull() = result.getOrNull() + + fun exceptionOrNull() = result.exceptionOrNull() + + fun getOrThrow() = result.getOrThrow() +} diff --git a/lib/src/main/kotlin/com/swmansion/starknet/provider/rpc/BuildJsonHttpDeserializer.kt b/lib/src/main/kotlin/com/swmansion/starknet/provider/rpc/BuildJsonHttpDeserializer.kt index 69af858e9..51a88df1b 100644 --- a/lib/src/main/kotlin/com/swmansion/starknet/provider/rpc/BuildJsonHttpDeserializer.kt +++ b/lib/src/main/kotlin/com/swmansion/starknet/provider/rpc/BuildJsonHttpDeserializer.kt @@ -1,5 +1,6 @@ package com.swmansion.starknet.provider.rpc +import com.swmansion.starknet.data.types.RequestResult import com.swmansion.starknet.data.types.StarknetResponse import com.swmansion.starknet.provider.exceptions.RequestFailedException import com.swmansion.starknet.provider.exceptions.RpcRequestFailedException @@ -13,9 +14,9 @@ private fun getResult( jsonRpcResponse: JsonRpcResponse, fullPayload: String, payload: String, -): Result { +): RequestResult { if (jsonRpcResponse.error != null) { - return Result.failure( + return RequestResult.failure( RpcRequestFailedException( code = jsonRpcResponse.error.code, message = jsonRpcResponse.error.message, @@ -26,25 +27,25 @@ private fun getResult( } if (jsonRpcResponse.result == null) { - return Result.failure( + return RequestResult.failure( RequestFailedException( message = "Response did not contain a result", payload = fullPayload, ), ) } - return Result.success(jsonRpcResponse.result) + return RequestResult.success(jsonRpcResponse.result) } private fun getOrderedRpcResults( response: HttpResponse, deserializationStrategies: List>, deserializationJson: Json, -): List> { +): List> { if (!response.isSuccessful) throw RequestFailedException(payload = response.body) val jsonResponses = Json.parseToJsonElement(response.body).jsonArray - val orderedResults = MutableList?>(jsonResponses.size) { null } + val orderedResults = MutableList?>(jsonResponses.size) { null } jsonResponses.forEach { jsonElement -> val id = jsonElement.jsonObject["id"]!!.jsonPrimitive.int @@ -92,13 +93,13 @@ internal fun buildJsonHttpDeserializer( internal fun buildJsonHttpBatchDeserializer( deserializationStrategies: List>, deserializationJson: Json, -): HttpResponseDeserializer>> = Function { response -> +): HttpResponseDeserializer>> = Function { response -> getOrderedRpcResults(response, deserializationStrategies, deserializationJson) } internal fun buildJsonHttpBatchDeserializerOfDifferentTypes( deserializationStrategies: List>, deserializationJson: Json, -): HttpResponseDeserializer>> = Function { response -> +): HttpResponseDeserializer>> = Function { response -> getOrderedRpcResults(response, deserializationStrategies, deserializationJson) } diff --git a/lib/src/main/kotlin/com/swmansion/starknet/service/http/requests/HttpBatchRequest.kt b/lib/src/main/kotlin/com/swmansion/starknet/service/http/requests/HttpBatchRequest.kt index 1555146da..a19878a12 100644 --- a/lib/src/main/kotlin/com/swmansion/starknet/service/http/requests/HttpBatchRequest.kt +++ b/lib/src/main/kotlin/com/swmansion/starknet/service/http/requests/HttpBatchRequest.kt @@ -1,5 +1,6 @@ package com.swmansion.starknet.service.http.requests +import com.swmansion.starknet.data.types.RequestResult import com.swmansion.starknet.data.types.StarknetResponse import com.swmansion.starknet.provider.Request import com.swmansion.starknet.provider.rpc.JsonRpcRequest @@ -13,15 +14,15 @@ import java.util.concurrent.CompletableFuture class HttpBatchRequest private constructor( private val payload: HttpService.Payload, - private val deserializer: HttpResponseDeserializer>>, + private val deserializer: HttpResponseDeserializer>>, private val service: HttpService, -) : Request>> { - override fun send(): List> { +) : Request>> { + override fun send(): List> { val response = service.send(payload) return deserializer.apply(response) } - override fun sendAsync(): CompletableFuture>> { + override fun sendAsync(): CompletableFuture>> { return service.sendAsync(payload).thenApplyAsync(deserializer) }