use crate::{types::Transaction, Request};
use serde::{Deserialize, Serialize};
#[derive(Default, Debug, Clone, Serialize)]
pub struct TxRequest {
transaction: String,
#[serde(skip_serializing_if = "Option::is_none")]
binary: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
min_ledger: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
max_ledger: Option<u32>,
}
impl Request for TxRequest {
type Response = TxResponse;
fn method(&self) -> String {
"tx".to_owned()
}
}
impl TxRequest {
pub fn new(transaction: &str) -> Self {
Self {
transaction: transaction.to_owned(),
..Default::default()
}
}
pub fn binary(self, binary: bool) -> Self {
Self {
binary: Some(binary),
..self
}
}
}
#[derive(Debug, Deserialize)]
pub struct TxResponse {
#[serde(flatten)]
pub tx: Transaction,
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn test_deserialize_tx_response() {
let json = r#"
{
"Account": "rhhh49pFH96roGyuC4E5P4CHaNjS1k8gzM",
"Fee": "12",
"Flags": 0,
"LastLedgerSequence": 56865248,
"OfferSequence": 5037708,
"Sequence": 5037710,
"SigningPubKey": "03B51A3EDF70E4098DA7FB053A01C5A6A0A163A30ED1445F14F87C7C3295FCB3BE",
"TakerGets": "15000000000",
"TakerPays": {
"currency": "CNY",
"issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y",
"value": "20160.75"
},
"TransactionType": "OfferCreate",
"TxnSignature": "3045022100A5023A0E64923616FCDB6D664F569644C7C9D1895772F986CD6B981B515B02A00220530C973E9A8395BC6FE2484948D2751F6B030FC7FB8575D1BFB406368AD554D9",
"date": 648248020,
"hash": "C53ECF838647FA5A4C780377025FEC7999AB4182590510CA461444B207AB74A9",
"inLedger": 56865245,
"ledger_index": 56865245,
"meta": {
"AffectedNodes": [
{
"ModifiedNode": {
"FinalFields": {
"ExchangeRate": "4F04C66806CF7400",
"Flags": 0,
"RootIndex": "02BAAC1E67C1CE0E96F0FA2E8061020536CEDD043FEB0FF54F04C66806CF7400",
"TakerGetsCurrency": "0000000000000000000000000000000000000000",
"TakerGetsIssuer": "0000000000000000000000000000000000000000",
"TakerPaysCurrency": "000000000000000000000000434E590000000000",
"TakerPaysIssuer": "CED6E99370D5C00EF4EBF72567DA99F5661BFB3A"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "02BAAC1E67C1CE0E96F0FA2E8061020536CEDD043FEB0FF54F04C66806CF7400"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Account": "rhhh49pFH96roGyuC4E5P4CHaNjS1k8gzM",
"Balance": "10404767991",
"Flags": 0,
"OwnerCount": 3,
"Sequence": 5037711
},
"LedgerEntryType": "AccountRoot",
"LedgerIndex": "1DECD9844E95FFBA273F1B94BA0BF2564DDF69F2804497A6D7837B52050174A2",
"PreviousFields": {
"Balance": "10404768003",
"Sequence": 5037710
},
"PreviousTxnID": "4DC47B246B5EB9CCE92ABA8C482479E3BF1F946CABBEF74CA4DE36521D5F9008",
"PreviousTxnLgrSeq": 56865244
}
},
{
"DeletedNode": {
"FinalFields": {
"Account": "rhhh49pFH96roGyuC4E5P4CHaNjS1k8gzM",
"BookDirectory": "02BAAC1E67C1CE0E96F0FA2E8061020536CEDD043FEB0FF54F04C66806CF7400",
"BookNode": "0000000000000000",
"Flags": 0,
"OwnerNode": "0000000000000000",
"PreviousTxnID": "8F5FF57B404827F12BDA7561876A13C3E3B3095CBF75334DBFB5F227391A660C",
"PreviousTxnLgrSeq": 56865244,
"Sequence": 5037708,
"TakerGets": "15000000000",
"TakerPays": {
"currency": "CNY",
"issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y",
"value": "20160.75"
}
},
"LedgerEntryType": "Offer",
"LedgerIndex": "26AAE6CA8D29E28A47C92ADF22D5D96A0216F0551E16936856DDC8CB1AAEE93B"
}
},
{
"ModifiedNode": {
"FinalFields": {
"Flags": 0,
"IndexNext": "0000000000000000",
"IndexPrevious": "0000000000000000",
"Owner": "rhhh49pFH96roGyuC4E5P4CHaNjS1k8gzM",
"RootIndex": "47FAF5D102D8CE655574F440CDB97AC67C5A11068BB3759E87C2B9745EE94548"
},
"LedgerEntryType": "DirectoryNode",
"LedgerIndex": "47FAF5D102D8CE655574F440CDB97AC67C5A11068BB3759E87C2B9745EE94548"
}
},
{
"CreatedNode": {
"LedgerEntryType": "Offer",
"LedgerIndex": "8BAEE3C7DE04A568E96007420FA11ABD0BC9AE44D35932BB5640E9C3FB46BC9B",
"NewFields": {
"Account": "rhhh49pFH96roGyuC4E5P4CHaNjS1k8gzM",
"BookDirectory": "02BAAC1E67C1CE0E96F0FA2E8061020536CEDD043FEB0FF54F04C66806CF7400",
"Sequence": 5037710,
"TakerGets": "15000000000",
"TakerPays": {
"currency": "CNY",
"issuer": "rKiCet8SdvWxPXnAgYarFUXMh1zCPz432Y",
"value": "20160.75"
}
}
}
}
],
"TransactionIndex": 0,
"TransactionResult": "tesSUCCESS"
},
"validated": true
}
"#;
let _tx_response: TxResponse = serde_json::from_str(json).unwrap();
}
}