use crate::models::FlagCollection;
use crate::models::Model;
use crate::models::{ledger::objects::LedgerEntryType, NoFlags};
use alloc::borrow::Cow;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use super::{CommonFields, LedgerObject};
#[skip_serializing_none]
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone)]
#[serde(rename_all = "PascalCase")]
pub struct FeeSettings<'a> {
#[serde(flatten)]
pub common_fields: CommonFields<'a, NoFlags>,
pub base_fee: Cow<'a, str>,
pub reference_fee_units: u32,
pub reserve_base: u32,
pub reserve_increment: u32,
}
impl<'a> Model for FeeSettings<'a> {}
impl<'a> LedgerObject<NoFlags> for FeeSettings<'a> {
fn get_ledger_entry_type(&self) -> LedgerEntryType {
self.common_fields.get_ledger_entry_type()
}
}
impl<'a> FeeSettings<'a> {
pub fn new(
index: Option<Cow<'a, str>>,
ledger_index: Option<Cow<'a, str>>,
base_fee: Cow<'a, str>,
reference_fee_units: u32,
reserve_base: u32,
reserve_increment: u32,
) -> Self {
Self {
common_fields: CommonFields {
flags: FlagCollection::default(),
ledger_entry_type: LedgerEntryType::FeeSettings,
index,
ledger_index,
},
base_fee,
reference_fee_units,
reserve_base,
reserve_increment,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_serde() {
let fee_settings = FeeSettings::new(
Some(Cow::from(
"4BC50C9B0D8515D3EAAE1E74B29A95804346C491EE1A95BF25E4AAB854A6A651",
)),
None,
Cow::from("000000000000000A"),
10,
20000000,
5000000,
);
let serialized = serde_json::to_string(&fee_settings).unwrap();
let deserialized: FeeSettings = serde_json::from_str(&serialized).unwrap();
assert_eq!(fee_settings, deserialized);
}
}