use alloc::borrow::Cow;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use crate::models::{
transactions::{Transaction, TransactionType},
Model, NoFlags, ValidateCurrencies, XRPLModelResult,
};
use super::mptoken_issuance_set::validate_mptoken_issuance_id;
use super::{CommonFields, CommonTransactionBuilder};
#[skip_serializing_none]
#[derive(
Debug,
Default,
Serialize,
Deserialize,
PartialEq,
Eq,
Clone,
xrpl_rust_macros::ValidateCurrencies,
)]
#[serde(rename_all = "PascalCase")]
pub struct MPTokenIssuanceDestroy<'a> {
#[serde(flatten)]
pub common_fields: CommonFields<'a, NoFlags>,
#[serde(rename = "MPTokenIssuanceID")]
pub mptoken_issuance_id: Cow<'a, str>,
}
impl<'a> Model for MPTokenIssuanceDestroy<'a> {
fn get_errors(&self) -> XRPLModelResult<()> {
validate_mptoken_issuance_id(self.mptoken_issuance_id.as_ref())?;
self.validate_currencies()
}
}
impl<'a> Transaction<'a, NoFlags> for MPTokenIssuanceDestroy<'a> {
fn has_flag(&self, flag: &NoFlags) -> bool {
self.common_fields.has_flag(flag)
}
fn get_transaction_type(&self) -> &TransactionType {
self.common_fields.get_transaction_type()
}
fn get_common_fields(&self) -> &CommonFields<'_, NoFlags> {
self.common_fields.get_common_fields()
}
fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
self.common_fields.get_mut_common_fields()
}
}
impl<'a> CommonTransactionBuilder<'a, NoFlags> for MPTokenIssuanceDestroy<'a> {
fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
&mut self.common_fields
}
fn into_self(self) -> Self {
self
}
}
impl<'a> MPTokenIssuanceDestroy<'a> {
pub fn with_mptoken_issuance_id(mut self, id: Cow<'a, str>) -> Self {
self.mptoken_issuance_id = id;
self
}
}
#[cfg(test)]
mod tests {
use crate::models::Model;
use super::*;
use crate::utils::testing::test_constants::*;
#[test]
fn test_serde() {
let txn = MPTokenIssuanceDestroy {
common_fields: CommonFields {
account: ACCOUNT_ISSUER.into(),
transaction_type: TransactionType::MPTokenIssuanceDestroy,
fee: Some("10".into()),
..Default::default()
},
mptoken_issuance_id: "00000001A407AF5856CEFBF81F3D4A0000000000A407AF58".into(),
};
let json_str = serde_json::to_string(&txn).unwrap();
let deserialized: MPTokenIssuanceDestroy = serde_json::from_str(&json_str).unwrap();
assert_eq!(txn, deserialized);
}
#[test]
fn test_builder_pattern() {
let txn = MPTokenIssuanceDestroy {
common_fields: CommonFields {
account: ACCOUNT_ISSUER.into(),
transaction_type: TransactionType::MPTokenIssuanceDestroy,
..Default::default()
},
..Default::default()
}
.with_mptoken_issuance_id("00000001A407AF5856CEFBF81F3D4A0000000000A407AF58".into())
.with_fee("12".into())
.with_sequence(100);
assert_eq!(
txn.mptoken_issuance_id.as_ref(),
"00000001A407AF5856CEFBF81F3D4A0000000000A407AF58"
);
assert!(txn.validate().is_ok());
}
#[test]
fn test_default() {
let txn = MPTokenIssuanceDestroy {
common_fields: CommonFields {
account: ACCOUNT_ISSUER.into(),
transaction_type: TransactionType::MPTokenIssuanceDestroy,
..Default::default()
},
mptoken_issuance_id: "00000001A407AF5856CEFBF81F3D4A0000000000A407AF58".into(),
};
assert!(txn.validate().is_ok());
}
#[test]
fn test_invalid_mptoken_issuance_id() {
let txn = MPTokenIssuanceDestroy {
common_fields: CommonFields {
account: ACCOUNT_ISSUER.into(),
transaction_type: TransactionType::MPTokenIssuanceDestroy,
..Default::default()
},
mptoken_issuance_id: "00000001A407AF5856CEFBF81F3D4A00".into(),
};
assert!(txn.validate().is_err());
}
#[test]
fn test_transaction_trait_methods() {
use crate::models::transactions::Transaction;
let mut txn = MPTokenIssuanceDestroy {
common_fields: CommonFields {
account: ACCOUNT_ISSUER.into(),
transaction_type: TransactionType::MPTokenIssuanceDestroy,
..Default::default()
},
mptoken_issuance_id: "00000001A407AF5856CEFBF81F3D4A0000000000A407AF58".into(),
};
assert_eq!(
*txn.get_transaction_type(),
TransactionType::MPTokenIssuanceDestroy
);
assert_eq!(txn.get_common_fields().account.as_ref(), ACCOUNT_ISSUER);
Transaction::get_mut_common_fields(&mut txn).sequence = Some(42);
assert_eq!(txn.common_fields.sequence, Some(42));
}
}