use serde_json::json;
use crate::rebased::{
RpcClient,
client::{RawRpcResponse, RpcResult},
};
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use super::{
super::{CheckpointDigest, CheckpointSequenceNumber, EpochId, TransactionDigest, bigint::BigInt},
IotaTransactionBlockResponse, IotaTransactionBlockResponseOptions,
};
#[serde_as]
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Checkpoint {
#[serde_as(as = "BigInt<u64>")]
pub epoch: EpochId,
#[serde_as(as = "BigInt<u64>")]
pub sequence_number: CheckpointSequenceNumber,
pub digest: CheckpointDigest,
}
#[serde_as]
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CheckpointId {
SequenceNumber(#[serde_as(as = "BigInt<u64>")] CheckpointSequenceNumber),
Digest(CheckpointDigest),
}
impl From<CheckpointSequenceNumber> for CheckpointId {
fn from(seq: CheckpointSequenceNumber) -> Self {
Self::SequenceNumber(seq)
}
}
impl From<CheckpointDigest> for CheckpointId {
fn from(digest: CheckpointDigest) -> Self {
Self::Digest(digest)
}
}
pub trait ReadApi {
async fn get_transaction_block(
&self,
digest: TransactionDigest,
options: Option<IotaTransactionBlockResponseOptions>,
) -> RpcResult<IotaTransactionBlockResponse>;
async fn get_checkpoint(
&self,
id: CheckpointId,
) -> RpcResult<Checkpoint>;
}
impl ReadApi for RpcClient {
async fn get_transaction_block(
&self,
digest: TransactionDigest,
options: Option<IotaTransactionBlockResponseOptions>,
) -> RpcResult<IotaTransactionBlockResponse> {
let request_body = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "iota_getTransactionBlock",
"params": [json!(digest.to_string()), json!(options)]
});
let response = self.client.post(self.url.clone()).json(&request_body).send().await?;
let body: RawRpcResponse<IotaTransactionBlockResponse> = response.json().await?;
body.into_result()
}
async fn get_checkpoint(
&self,
id: CheckpointId,
) -> RpcResult<Checkpoint> {
let request_body = json!({
"jsonrpc": "2.0",
"id": 1,
"method": "iota_getCheckpoint",
"params": [json!(id)]
});
let response = self.client.post(self.url.clone()).json(&request_body).send().await?;
let body: RawRpcResponse<Checkpoint> = response.json().await?;
body.into_result()
}
}