tenderdash_proto/serializers/
optional.rs

1//! Serialize/deserialize `Option<T>` type where `T` has a
2//! serializer/deserializer. Use `null` if the received value equals the
3//! `Default` implementation.
4// Todo: Rename this serializer to something like "default_eq_none" to mirror
5// its purpose better.
6use serde::{Deserialize, Deserializer, Serialize, Serializer};
7
8/// Deserialize `Option<T>`
9pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Option<T>, D::Error>
10where
11    D: Deserializer<'de>,
12    T: Deserialize<'de> + Default + PartialEq,
13{
14    Ok(Option::<T>::deserialize(deserializer)?.filter(|t| t != &T::default()))
15}
16
17/// Serialize `Option<T>`
18pub fn serialize<S, T>(value: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
19where
20    S: Serializer,
21    T: Default + Serialize,
22{
23    match value {
24        Some(v) => v.serialize(serializer),
25        None => T::default().serialize(serializer),
26    }
27}