Skip to content

Commit

Permalink
Add RequestResult type (#478)
Browse files Browse the repository at this point in the history
  • Loading branch information
franciszekjob committed Jun 13, 2024
1 parent d7b2cb8 commit 4aa9f2a
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 12 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.swmansion.starknet.data.types

data class RequestResult<out T>(val result: Result<T>) {
companion object {
fun <T> success(value: T) = RequestResult(Result.success(value))

fun <T> failure(throwable: Throwable): RequestResult<T> = 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()
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -13,9 +14,9 @@ private fun <T : StarknetResponse> getResult(
jsonRpcResponse: JsonRpcResponse<T>,
fullPayload: String,
payload: String,
): Result<T> {
): RequestResult<T> {
if (jsonRpcResponse.error != null) {
return Result.failure(
return RequestResult.failure(
RpcRequestFailedException(
code = jsonRpcResponse.error.code,
message = jsonRpcResponse.error.message,
Expand All @@ -26,25 +27,25 @@ private fun <T : StarknetResponse> 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 <T : StarknetResponse> getOrderedRpcResults(
response: HttpResponse,
deserializationStrategies: List<KSerializer<out T>>,
deserializationJson: Json,
): List<Result<T>> {
): List<RequestResult<T>> {
if (!response.isSuccessful) throw RequestFailedException(payload = response.body)

val jsonResponses = Json.parseToJsonElement(response.body).jsonArray
val orderedResults = MutableList<Result<T>?>(jsonResponses.size) { null }
val orderedResults = MutableList<RequestResult<T>?>(jsonResponses.size) { null }

jsonResponses.forEach { jsonElement ->
val id = jsonElement.jsonObject["id"]!!.jsonPrimitive.int
Expand Down Expand Up @@ -92,13 +93,13 @@ internal fun <T : StarknetResponse> buildJsonHttpDeserializer(
internal fun <T : StarknetResponse> buildJsonHttpBatchDeserializer(
deserializationStrategies: List<KSerializer<T>>,
deserializationJson: Json,
): HttpResponseDeserializer<List<Result<T>>> = Function { response ->
): HttpResponseDeserializer<List<RequestResult<T>>> = Function { response ->
getOrderedRpcResults(response, deserializationStrategies, deserializationJson)
}

internal fun <T : StarknetResponse> buildJsonHttpBatchDeserializerOfDifferentTypes(
deserializationStrategies: List<KSerializer<out T>>,
deserializationJson: Json,
): HttpResponseDeserializer<List<Result<T>>> = Function { response ->
): HttpResponseDeserializer<List<RequestResult<T>>> = Function { response ->
getOrderedRpcResults(response, deserializationStrategies, deserializationJson)
}
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -13,15 +14,15 @@ import java.util.concurrent.CompletableFuture

class HttpBatchRequest<T : StarknetResponse> private constructor(
private val payload: HttpService.Payload,
private val deserializer: HttpResponseDeserializer<List<Result<T>>>,
private val deserializer: HttpResponseDeserializer<List<RequestResult<T>>>,
private val service: HttpService,
) : Request<List<Result<T>>> {
override fun send(): List<Result<T>> {
) : Request<List<RequestResult<T>>> {
override fun send(): List<RequestResult<T>> {
val response = service.send(payload)
return deserializer.apply(response)
}

override fun sendAsync(): CompletableFuture<List<Result<T>>> {
override fun sendAsync(): CompletableFuture<List<RequestResult<T>>> {
return service.sendAsync(payload).thenApplyAsync(deserializer)
}

Expand Down

0 comments on commit 4aa9f2a

Please sign in to comment.