use super::*;
impl<N: Network> Serialize for Ratifications<N> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match serializer.is_human_readable() {
true => {
let mut ratifications = serializer.serialize_seq(Some(self.ratifications.len()))?;
for ratify in self.ratifications.values() {
ratifications.serialize_element(ratify)?;
}
ratifications.end()
}
false => ToBytesSerializer::serialize_with_size_encoding(self, serializer),
}
}
}
impl<'de, N: Network> Deserialize<'de> for Ratifications<N> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
match deserializer.is_human_readable() {
true => {
use core::marker::PhantomData;
struct RatificationsDeserializer<N: Network>(PhantomData<N>);
impl<'de, N: Network> Visitor<'de> for RatificationsDeserializer<N> {
type Value = Vec<Ratify<N>>;
fn expecting(&self, formatter: &mut Formatter) -> fmt::Result {
formatter.write_str("Vec<Ratify> sequence.")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let mut ratifications = Vec::new();
while let Some(ratify) = seq.next_element()? {
ratifications.push(ratify);
}
Ok(ratifications)
}
}
Self::try_from(deserializer.deserialize_seq(RatificationsDeserializer(PhantomData))?)
.map_err(de::Error::custom)
}
false => FromBytesDeserializer::<Self>::deserialize_with_size_encoding(deserializer, "ratifications"),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use console::network::Testnet3;
type CurrentNetwork = Testnet3;
const ITERATIONS: u32 = 100;
#[test]
fn test_serde_json() {
let rng = &mut TestRng::default();
let check_serde_json = |expected: Ratifications<CurrentNetwork>| {
let expected_string = &expected.to_string();
let candidate_string = serde_json::to_string(&expected).unwrap();
assert_eq!(expected, Ratifications::from_str(expected_string).unwrap());
assert_eq!(expected, serde_json::from_str(&candidate_string).unwrap());
};
for _ in 0..ITERATIONS {
check_serde_json(crate::ratifications::test_helpers::sample_block_ratifications(rng));
}
}
#[test]
fn test_bincode() {
let rng = &mut TestRng::default();
let check_bincode = |expected: Ratifications<CurrentNetwork>| {
let expected_bytes = expected.to_bytes_le().unwrap();
let expected_bytes_with_size_encoding = bincode::serialize(&expected).unwrap();
assert_eq!(&expected_bytes[..], &expected_bytes_with_size_encoding[8..]);
assert_eq!(expected, Ratifications::read_le(&expected_bytes[..]).unwrap());
assert_eq!(expected, bincode::deserialize(&expected_bytes_with_size_encoding[..]).unwrap());
};
for _ in 0..ITERATIONS {
check_bincode(crate::ratifications::test_helpers::sample_block_ratifications(rng));
}
}
}