snarkvm_ledger_block/header/metadata/
serialize.rs1use super::*;
17
18impl<N: Network> Serialize for Metadata<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 metadata = serializer.serialize_struct("Metadata", 10)?;
24 metadata.serialize_field("network", &self.network)?;
25 metadata.serialize_field("round", &self.round)?;
26 metadata.serialize_field("height", &self.height)?;
27 metadata.serialize_field("cumulative_weight", &self.cumulative_weight.to_string())?;
28 metadata.serialize_field("cumulative_proof_target", &self.cumulative_proof_target.to_string())?;
29 metadata.serialize_field("coinbase_target", &self.coinbase_target)?;
30 metadata.serialize_field("proof_target", &self.proof_target)?;
31 metadata.serialize_field("last_coinbase_target", &self.last_coinbase_target)?;
32 metadata.serialize_field("last_coinbase_timestamp", &self.last_coinbase_timestamp)?;
33 metadata.serialize_field("timestamp", &self.timestamp)?;
34 metadata.end()
35 }
36 false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
37 }
38 }
39}
40
41impl<'de, N: Network> Deserialize<'de> for Metadata<N> {
42 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
44 match deserializer.is_human_readable() {
45 true => {
46 let mut metadata = serde_json::Value::deserialize(deserializer)?;
47 let cumulative_weight: String =
48 DeserializeExt::take_from_value::<D>(&mut metadata, "cumulative_weight")?;
49 let cumulative_proof_target: String =
50 DeserializeExt::take_from_value::<D>(&mut metadata, "cumulative_proof_target")?;
51 let cumulative_weight = cumulative_weight.parse::<u128>().map_err(de::Error::custom)?;
52 let cumulative_proof_target = cumulative_proof_target.parse::<u128>().map_err(de::Error::custom)?;
53 Ok(Self::new(
54 DeserializeExt::take_from_value::<D>(&mut metadata, "network")?,
55 DeserializeExt::take_from_value::<D>(&mut metadata, "round")?,
56 DeserializeExt::take_from_value::<D>(&mut metadata, "height")?,
57 cumulative_weight,
58 cumulative_proof_target,
59 DeserializeExt::take_from_value::<D>(&mut metadata, "coinbase_target")?,
60 DeserializeExt::take_from_value::<D>(&mut metadata, "proof_target")?,
61 DeserializeExt::take_from_value::<D>(&mut metadata, "last_coinbase_target")?,
62 DeserializeExt::take_from_value::<D>(&mut metadata, "last_coinbase_timestamp")?,
63 DeserializeExt::take_from_value::<D>(&mut metadata, "timestamp")?,
64 )
65 .map_err(de::Error::custom)?)
66 }
67 false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "metadata"),
68 }
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn test_serde_json() -> Result<()> {
78 let rng = &mut TestRng::default();
79
80 for expected in [crate::header::metadata::test_helpers::sample_block_metadata(rng)].into_iter() {
81 let expected_string = &expected.to_string();
83 let candidate_string = serde_json::to_string(&expected)?;
84
85 assert_eq!(expected, Metadata::from_str(expected_string)?);
87 assert_eq!(expected, serde_json::from_str(&candidate_string)?);
88 }
89 Ok(())
90 }
91
92 #[test]
93 fn test_bincode() -> Result<()> {
94 let rng = &mut TestRng::default();
95
96 for expected in [crate::header::metadata::test_helpers::sample_block_metadata(rng)].into_iter() {
97 let expected_bytes = expected.to_bytes_le()?;
99 let expected_bytes_with_size_encoding = bincode::serialize(&expected)?;
100 assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
101
102 assert_eq!(expected, Metadata::read_le(&expected_bytes[..])?);
104 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?);
105 }
106 Ok(())
107 }
108}