tendermint_proto/serializers/
optional.rs

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