use derive_getters::Getters;
use serde::Deserialize;
use stellar_xdr::curr::{LedgerHeader, Limits, ReadXdr};
use crate::models::prelude::*;
#[derive(Debug, Deserialize, Clone, Getters)]
pub struct LedgerLinks {
#[serde(rename = "self")]
pub self_link: Link,
pub transactions: TemplateLink,
pub operations: TemplateLink,
pub payments: TemplateLink,
pub effects: TemplateLink,
}
#[derive(Debug, Deserialize, Clone, Getters)]
pub struct Ledger {
#[serde(rename = "_links")]
links: LedgerLinks,
id: String,
paging_token: String,
hash: String,
prev_hash: String,
sequence: i32,
successful_transaction_count: i32,
failed_transaction_count: i32,
operation_count: i32,
tx_set_operation_count: i32,
closed_at: String,
total_coins: String,
fee_pool: String,
base_fee_in_stroops: i32,
base_reserve_in_stroops: i32,
max_tx_set_size: i32,
protocol_version: i32,
header_xdr: String,
}
#[derive(Debug, Deserialize, Clone, Getters)]
pub struct LedgersResponse {
#[serde(rename = "_links")]
links: ResponseLinks,
#[serde(rename = "_embedded")]
embedded: Embedded<Ledger>,
}
impl Response for LedgersResponse {
fn from_json(json: String) -> Result<Self, String> {
serde_json::from_str(&json).map_err(|e| e.to_string())
}
}
impl Response for Ledger {
fn from_json(json: String) -> Result<Self, String> {
let ledger_record = serde_json::from_str(&json).map_err(|e| e.to_string())?;
Ok(ledger_record)
}
}
impl Ledger {
pub fn decoded_header_xdr(&self) -> Result<LedgerHeader, String> {
let encoded = self.header_xdr.as_bytes();
let decoded = LedgerHeader::from_xdr_base64(encoded, Limits::none()).unwrap();
Ok(decoded)
}
}