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