Skip to main content

buffa_types/
empty_ext.rs

1//! Ergonomic helpers for [`google::protobuf::Empty`](crate::google::protobuf::Empty).
2
3#[cfg(feature = "json")]
4use crate::google::protobuf::Empty;
5
6#[cfg(feature = "json")]
7impl serde::Serialize for Empty {
8    /// Serializes as an empty JSON object `{}`.
9    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
10        use serde::ser::SerializeMap;
11        s.serialize_map(Some(0))?.end()
12    }
13}
14
15#[cfg(feature = "json")]
16impl<'de> serde::Deserialize<'de> for Empty {
17    /// Deserializes from a JSON object (any fields are ignored).
18    fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
19        use serde::de::{MapAccess, Visitor};
20        struct V;
21        impl<'de> Visitor<'de> for V {
22            type Value = Empty;
23            fn expecting(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
24                f.write_str("an empty JSON object")
25            }
26            fn visit_map<A: MapAccess<'de>>(self, mut map: A) -> Result<Empty, A::Error> {
27                while map
28                    .next_entry::<serde::de::IgnoredAny, serde::de::IgnoredAny>()?
29                    .is_some()
30                {}
31                Ok(Empty {
32                    ..Default::default()
33                })
34            }
35        }
36        d.deserialize_map(V)
37    }
38}
39
40#[cfg(all(test, feature = "json"))]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn empty_serializes_as_empty_object() {
46        let e = Empty::default();
47        assert_eq!(serde_json::to_string(&e).unwrap(), "{}");
48    }
49
50    #[test]
51    fn empty_deserializes_from_empty_object() {
52        let _: Empty = serde_json::from_str("{}").unwrap();
53    }
54}