serialize.rs
1 // Copyright (c) 2019-2025 Alpha-Delta Network Inc. 2 // This file is part of the alphavm library. 3 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at: 7 8 // http://www.apache.org/licenses/LICENSE-2.0 9 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 16 use super::*; 17 18 impl<N: Network> Serialize for Metadata<N> { 19 /// Serializes the metadata to a JSON-string or buffer. 20 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 41 impl<'de, N: Network> Deserialize<'de> for Metadata<N> { 42 /// Deserializes the metadata from a JSON-string or buffer. 43 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)] 73 mod 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 // Serialize 82 let expected_string = &expected.to_string(); 83 let candidate_string = serde_json::to_string(&expected)?; 84 85 // Deserialize 86 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 // Serialize 98 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 // Deserialize 103 assert_eq!(expected, Metadata::read_le(&expected_bytes[..])?); 104 assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..])?); 105 } 106 Ok(()) 107 } 108 }