use serde::{Deserialize, Serialize};
use crate::event::Kind;
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct RelayFees {
#[serde(skip_serializing_if = "Vec::is_empty")]
pub admission: Vec<RelayFee>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub subscription: Vec<RelayFee>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub publication: Vec<RelayFee>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelayFee {
pub amount: u64,
pub unit: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub period: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub kinds: Option<Vec<Kind>>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fees_round_trip() {
let fees = RelayFees {
admission: vec![RelayFee {
amount: 1000,
unit: "msats".into(),
period: None,
kinds: None,
}],
subscription: vec![RelayFee {
amount: 5000,
unit: "msats".into(),
period: Some(2_592_000),
kinds: None,
}],
publication: vec![RelayFee {
amount: 100,
unit: "msats".into(),
period: None,
kinds: Some(vec![Kind::TEXT_NOTE]),
}],
};
let json = serde_json::to_string(&fees).unwrap();
let parsed: RelayFees = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, fees);
}
#[test]
fn empty_arrays_omitted() {
let fees = RelayFees::default();
let json = serde_json::to_string(&fees).unwrap();
assert_eq!(json, "{}");
}
}