snarkvm_ledger_block/transaction/fee/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for Fee<N> {
19 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
21 match serializer.is_human_readable() {
22 true => {
23 let mut fee = serializer.serialize_struct("Fee", 2 + self.proof.is_some() as usize)?;
24 fee.serialize_field("transition", &self.transition)?;
25 fee.serialize_field("global_state_root", &self.global_state_root)?;
26 if let Some(proof) = &self.proof {
27 fee.serialize_field("proof", proof)?;
28 }
29 fee.end()
30 }
31 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
32 }
33 }
34}
35
36impl<'de, N: Network> Deserialize<'de> for Fee<N> {
37 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
39 match deserializer.is_human_readable() {
40 true => {
41 let mut fee = serde_json::Value::deserialize(deserializer)?;
43 let transition = DeserializeExt::take_from_value::<D>(&mut fee, "transition")?;
45 let global_state_root = DeserializeExt::take_from_value::<D>(&mut fee, "global_state_root")?;
47 let proof = serde_json::from_value(fee.get_mut("proof").unwrap_or(&mut serde_json::Value::Null).take())
49 .map_err(de::Error::custom)?;
50 Self::from(transition, global_state_root, proof).map_err(de::Error::custom)
52 }
53 false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "fee"),
54 }
55 }
56}
57
58#[cfg(test)]
59mod tests {
60 use super::*;
61
62 #[test]
63 fn test_serde_json() -> Result<()> {
64 let rng = &mut TestRng::default();
65
66 let expected = crate::transaction::fee::test_helpers::sample_fee_private_hardcoded(rng);
68
69 let expected_string = &expected.to_string();
71 let candidate_string = serde_json::to_string(&expected)?;
72 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
73
74 assert_eq!(expected, Fee::from_str(expected_string)?);
76 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
77
78 let expected = crate::transaction::fee::test_helpers::sample_fee_public_hardcoded(rng);
80
81 let expected_string = &expected.to_string();
83 let candidate_string = serde_json::to_string(&expected)?;
84 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
85
86 assert_eq!(expected, Fee::from_str(expected_string)?);
88 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
89
90 Ok(())
91 }
92
93 #[test]
94 fn test_bincode() -> Result<()> {
95 let rng = &mut TestRng::default();
96
97 let expected = crate::transaction::fee::test_helpers::sample_fee_private_hardcoded(rng);
99
100 let expected_bytes = expected.to_bytes_le()?;
102 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
103 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
104
105 assert_eq!(expected, Fee::read_le(&expected_bytes[..])?);
107 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
108
109 let expected = crate::transaction::fee::test_helpers::sample_fee_public_hardcoded(rng);
111
112 let expected_bytes = expected.to_bytes_le()?;
114 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
115 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
116
117 assert_eq!(expected, Fee::read_le(&expected_bytes[..])?);
119 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
120
121 Ok(())
122 }
123}