Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add RequestResult type #478

Merged
merged 8 commits into from
Jun 13, 2024
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.swmansion.starknet.data.types

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

fun <T> failure(throwable: Throwable): RequestResult<T> =
RequestResult(Result.failure(throwable))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit:

Suggested change
fun <T> success(value: T): RequestResult<T> = RequestResult(Result.success(value))
fun <T> failure(throwable: Throwable): RequestResult<T> =
RequestResult(Result.failure(throwable))
fun <T> success(value: T) = RequestResult(Result.success(value))
fun <T> failure(throwable: Throwable) = RequestResult(Result.failure(throwable))

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually in failure we have to keep RequestResult<T>, as there is not enough information to infer the type.

}

val isSuccess: Boolean
get() = result.isSuccess

val isFailure: Boolean
get() = result.isFailure

fun getOrNull(): T? = result.getOrNull()

fun exceptionOrNull(): Throwable? = result.exceptionOrNull()

fun getOrThrow(): T = 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
Loading