/ ledger / authority / src / serialize.rs
serialize.rs
  1  // Copyright (c) 2019-2025 Alpha-Delta Network Inc.
  2  // This file is part of the deltavm 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 Authority<N> {
 19      /// Serializes the authority into string or bytes.
 20      #[inline]
 21      fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
 22          match serializer.is_human_readable() {
 23              true => {
 24                  let mut authority = serializer.serialize_struct("Authority", 2)?;
 25                  match self {
 26                      Self::Beacon(signature) => {
 27                          authority.serialize_field("type", "beacon")?;
 28                          authority.serialize_field("signature", signature)?;
 29                      }
 30                      Self::Quorum(subdag) => {
 31                          authority.serialize_field("type", "quorum")?;
 32                          authority.serialize_field("subdag", subdag)?;
 33                      }
 34                  }
 35                  authority.end()
 36              }
 37              false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
 38          }
 39      }
 40  }
 41  
 42  impl<'de, N: Network> Deserialize<'de> for Authority<N> {
 43      /// Deserializes the authority from a string or bytes.
 44      #[inline]
 45      fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
 46          match deserializer.is_human_readable() {
 47              true => {
 48                  let mut authority = serde_json::Value::deserialize(deserializer)?;
 49                  let type_: String = DeserializeExt::take_from_value::<D>(&mut authority, "type")?;
 50  
 51                  // Recover the authority.
 52                  match type_.as_str() {
 53                      "beacon" => Ok(Self::from_beacon(
 54                          DeserializeExt::take_from_value::<D>(&mut authority, "signature").map_err(de::Error::custom)?,
 55                      )),
 56                      "quorum" => Ok(Self::from_quorum(
 57                          DeserializeExt::take_from_value::<D>(&mut authority, "subdag").map_err(de::Error::custom)?,
 58                      )),
 59                      _ => Err(de::Error::custom(error("Invalid authority type"))),
 60                  }
 61              }
 62              false => FromBytesUncheckedDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "authority"),
 63          }
 64      }
 65  }
 66  
 67  #[cfg(test)]
 68  mod tests {
 69      use super::*;
 70      use console::prelude::TestRng;
 71  
 72      fn check_serde_json<
 73          T: Serialize + for<'a> Deserialize<'a> + Debug + Display + PartialEq + Eq + FromStr + ToBytes + FromBytes,
 74      >(
 75          expected: T,
 76      ) {
 77          // Serialize
 78          let expected_string = &expected.to_string();
 79          let candidate_string = serde_json::to_string(&expected).unwrap();
 80          assert_eq!(expected_string, &serde_json::Value::from_str(&candidate_string).unwrap().to_string());
 81  
 82          // Deserialize
 83          assert_eq!(expected, T::from_str(expected_string).unwrap_or_else(|_| panic!("FromStr: {expected_string}")));
 84          assert_eq!(expected, serde_json::from_str(&candidate_string).unwrap());
 85      }
 86  
 87      fn check_bincode<T: Serialize + for<'a> Deserialize<'a> + Debug + PartialEq + Eq + ToBytes + FromBytes>(
 88          expected: T,
 89      ) {
 90          // Serialize
 91          let expected_bytes = expected.to_bytes_le().unwrap();
 92          let expected_bytes_with_size_encoding = bincode::serialize(&expected).unwrap();
 93          assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
 94  
 95          // Deserialize
 96          assert_eq!(expected, T::read_le(&expected_bytes[..]).unwrap());
 97          assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..]).unwrap());
 98      }
 99  
100      #[test]
101      fn test_serde_json() {
102          let rng = &mut TestRng::default();
103  
104          for expected in crate::test_helpers::sample_authorities(rng) {
105              check_serde_json(expected);
106          }
107      }
108  
109      #[test]
110      fn test_bincode() {
111          let rng = &mut TestRng::default();
112  
113          for expected in crate::test_helpers::sample_authorities(rng) {
114              check_bincode(expected);
115          }
116      }
117  }