fedimint_ln_common/
serde_option_routing_fees.rs1use lightning_invoice::RoutingFees;
2use serde::ser::SerializeStruct;
3use serde::{Deserialize, Deserializer, Serializer};
4
5#[allow(missing_docs)]
6pub fn serialize<S>(fees: &Option<RoutingFees>, serializer: S) -> Result<S::Ok, S::Error>
7where
8 S: Serializer,
9{
10 if let Some(fees) = fees {
11 let mut state = serializer.serialize_struct("RoutingFees", 2)?;
12 state.serialize_field("base_msat", &fees.base_msat)?;
13 state.serialize_field("proportional_millionths", &fees.proportional_millionths)?;
14 state.end()
15 } else {
16 let state = serializer.serialize_struct("RoutingFees", 0)?;
17 state.end()
18 }
19}
20
21#[allow(missing_docs)]
22pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<RoutingFees>, D::Error>
23where
24 D: Deserializer<'de>,
25{
26 let fees = serde_json::Value::deserialize(deserializer)?;
27 let base_msat = fees["base_msat"].as_u64();
29
30 if let Some(base_msat) = base_msat
31 && let Some(proportional_millionths) = fees["proportional_millionths"].as_u64()
32 {
33 let base_msat: u32 = base_msat
34 .try_into()
35 .map_err(|_| serde::de::Error::custom("base_msat is greater than u32::MAX"))?;
36 let proportional_millionths: u32 = proportional_millionths.try_into().map_err(|_| {
37 serde::de::Error::custom("proportional_millionths is greater than u32::MAX")
38 })?;
39 return Ok(Some(RoutingFees {
40 base_msat,
41 proportional_millionths,
42 }));
43 }
44
45 Ok(None)
46}