use crate::{types::Transaction, Request, RetrieveLedgerSpec, ReturnLedgerSpec, WithLedgerSpec};
use serde::{Deserialize, Serialize};
use xrpl_types::LedgerTimestamp;
#[derive(Default, Debug, Clone, Serialize)]
pub struct ExpandLedgerRequest {
#[serde(flatten)]
pub ledger_request: LedgerRequest,
}
#[derive(Default, Debug, Clone, Serialize)]
pub struct LedgerRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub full: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accounts: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transactions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
expand: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner_funds: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub binary: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub queue: Option<bool>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub object_type: Option<ObjectType>,
#[serde(flatten)]
pub ledger_spec: RetrieveLedgerSpec,
}
#[derive(Clone, Debug, Copy, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ObjectType {
Account,
Amendments,
Amm,
Check,
DepositPreauth,
Directory,
Escrow,
Fee,
Hashes,
NftOffer,
NftPage,
Offer,
PaymentChannel,
SignerList,
State,
Ticket,
}
impl Request for LedgerRequest {
type Response = LedgerResponse<String>;
fn method(&self) -> String {
"ledger".to_owned()
}
}
impl WithLedgerSpec for LedgerRequest {
fn as_ledger_spec(&self) -> &crate::RetrieveLedgerSpec {
&self.ledger_spec
}
fn as_ledger_spec_mut(&mut self) -> &mut crate::RetrieveLedgerSpec {
&mut self.ledger_spec
}
}
impl LedgerRequest {
pub fn new() -> Self {
Self {
expand: Some(false),
..Default::default()
}
}
pub fn transactions(self, transactions: bool) -> Self {
Self {
transactions: Some(transactions),
..self
}
}
pub fn expanded(self) -> ExpandLedgerRequest {
ExpandLedgerRequest {
ledger_request: LedgerRequest {
expand: Some(true),
..self
},
}
}
}
impl Request for ExpandLedgerRequest {
type Response = LedgerResponse<Transaction>;
fn method(&self) -> String {
"ledger".to_owned()
}
}
#[derive(Debug, Deserialize)]
pub struct LedgerResponse<TransactionType> {
pub ledger: Ledger<TransactionType>,
#[serde(flatten)]
pub ledger_spec: ReturnLedgerSpec,
}
#[derive(Debug, Deserialize)]
pub struct Ledger<TransactionType> {
pub account_hash: String,
pub close_flags: u64,
pub close_time: LedgerTimestamp,
pub close_time_human: String,
pub close_time_resolution: u32,
pub closed: bool,
pub ledger_hash: String,
pub ledger_index: String,
pub parent_close_time: LedgerTimestamp,
pub parent_hash: String,
pub total_coins: String,
pub transaction_hash: String,
pub transactions: Option<Vec<TransactionType>>,
}