use alloc::borrow::Cow;
use serde::{Deserialize, Serialize};
use crate::models::requests::Marker;
#[serde_with::skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct AccountNfts<'a> {
pub account: Cow<'a, str>,
#[serde(rename = "account_nfts")]
pub nfts: Cow<'a, [NFToken<'a>]>,
pub ledger_hash: Option<Cow<'a, str>>,
pub ledger_index: Option<u32>,
pub ledger_current_index: Option<u32>,
pub validated: bool,
pub limit: Option<u32>,
pub marker: Option<Marker<'a>>,
}
#[serde_with::skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct NFToken<'a> {
#[serde(rename = "Flags")]
pub flags: u32,
#[serde(rename = "Issuer")]
pub issuer: Cow<'a, str>,
#[serde(rename = "NFTokenID")]
pub nft_id: Cow<'a, str>,
pub nft_serial: u32,
#[serde(rename = "NFTokenTaxon")]
pub token_taxon: u32,
#[serde(rename = "URI")]
pub uri: Option<Cow<'a, str>>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_account_nfts_deserialization() {
let json = r#"{
"account": "rsuHaTvJh1bDmDoxX9QcKP7HEBSBt4XsHx",
"account_nfts": [
{
"Flags": 1,
"Issuer": "rGJUF4PvVkMNxG6Bg6AKg3avhrtQyAffcm",
"NFTokenID": "00010000A7CAD27B688D14BA1A9FA5366554D6ADCF9CE0875B974D9F00000004",
"NFTokenTaxon": 0,
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"nft_serial": 4
},
{
"Flags": 1,
"Issuer": "rGJUF4PvVkMNxG6Bg6AKg3avhrtQyAffcm",
"NFTokenID": "00010000A7CAD27B688D14BA1A9FA5366554D6ADCF9CE087727D1EA000000005",
"NFTokenTaxon": 0,
"URI": "697066733A2F2F62616679626569676479727A74357366703775646D37687537367568377932366E6634646675796C71616266336F636C67747179353566627A6469",
"nft_serial": 5
}
],
"ledger_hash": "46497E9FF17A993324F1A0A693DC068B467184023C7FD162812265EAAFEB97CB",
"ledger_index": 2380559,
"status": "success",
"validated": true
}"#;
let account_nfts: AccountNfts = serde_json::from_str(json).unwrap();
assert_eq!(account_nfts.account, "rsuHaTvJh1bDmDoxX9QcKP7HEBSBt4XsHx");
assert_eq!(
account_nfts.ledger_hash.unwrap(),
"46497E9FF17A993324F1A0A693DC068B467184023C7FD162812265EAAFEB97CB"
);
assert_eq!(account_nfts.ledger_index, Some(2380559));
assert!(account_nfts.validated);
assert_eq!(account_nfts.nfts.len(), 2);
let first_nft = &account_nfts.nfts[0];
assert_eq!(first_nft.flags, 1);
assert_eq!(first_nft.issuer, "rGJUF4PvVkMNxG6Bg6AKg3avhrtQyAffcm");
assert_eq!(
first_nft.nft_id,
"00010000A7CAD27B688D14BA1A9FA5366554D6ADCF9CE0875B974D9F00000004"
);
assert_eq!(first_nft.token_taxon, 0);
assert_eq!(first_nft.nft_serial, 4);
assert_eq!(
first_nft.uri.as_ref().unwrap(),
"697066733A2F2F62616679626569676479727A7435736670\
3775646D37687537367568377932366E6634646675796C716\
16266336F636C67747179353566627A6469"
);
let second_nft = &account_nfts.nfts[1];
assert_eq!(second_nft.flags, 1);
assert_eq!(second_nft.issuer, "rGJUF4PvVkMNxG6Bg6AKg3avhrtQyAffcm");
assert_eq!(
second_nft.nft_id,
"00010000A7CAD27B688D14BA1A9FA5366554D6ADCF9CE087727D1EA000000005"
);
assert_eq!(second_nft.token_taxon, 0);
assert_eq!(second_nft.nft_serial, 5);
assert_eq!(
second_nft.uri.as_ref().unwrap(),
"697066733A2F2F62616679626569676479727A74357366703\
775646D37687537367568377932366E6634646675796C71616\
266336F636C67747179353566627A6469"
);
}
}