Skip to main content

fedimint_ln_common/
serde_option_routing_fees.rs

1use 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    // While we deserialize fields as u64, RoutingFees expects u32 for the fields
28    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}