vecmap/map/
serde.rs

1use super::VecMap;
2use core::fmt;
3use core::marker::PhantomData;
4use serde::de::{self, value::MapDeserializer};
5use serde::ser;
6
7impl<K, V> ser::Serialize for VecMap<K, V>
8where
9    K: ser::Serialize + Eq,
10    V: ser::Serialize,
11{
12    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13    where
14        S: ser::Serializer,
15    {
16        serializer.collect_map(self)
17    }
18}
19
20impl<'de, K, V> de::Deserialize<'de> for VecMap<K, V>
21where
22    K: de::Deserialize<'de> + Eq,
23    V: de::Deserialize<'de>,
24{
25    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
26    where
27        D: de::Deserializer<'de>,
28    {
29        struct VecMapVisitor<K, V>(PhantomData<(K, V)>);
30
31        impl<'de, K, V> de::Visitor<'de> for VecMapVisitor<K, V>
32        where
33            K: de::Deserialize<'de> + Eq,
34            V: de::Deserialize<'de>,
35        {
36            type Value = VecMap<K, V>;
37
38            fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
39                fmt.write_str("a map")
40            }
41
42            fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
43            where
44                A: de::MapAccess<'de>,
45            {
46                let mut values = VecMap::with_capacity(map.size_hint().unwrap_or(0));
47
48                while let Some((key, value)) = map.next_entry()? {
49                    values.insert(key, value);
50                }
51
52                Ok(values)
53            }
54        }
55
56        deserializer.deserialize_map(VecMapVisitor(PhantomData))
57    }
58}
59
60impl<'de, K, V, E> de::IntoDeserializer<'de, E> for VecMap<K, V>
61where
62    K: de::IntoDeserializer<'de, E> + Eq,
63    V: de::IntoDeserializer<'de, E>,
64    E: de::Error,
65{
66    type Deserializer = MapDeserializer<'de, <Self as IntoIterator>::IntoIter, E>;
67
68    fn into_deserializer(self) -> Self::Deserializer {
69        MapDeserializer::new(self.into_iter())
70    }
71}
72
73#[cfg(test)]
74mod test {
75    use super::*;
76    use serde_test::{assert_tokens, Token};
77
78    #[test]
79    fn ser_de_empty() {
80        let map = VecMap::<u8, &str>::new();
81        assert_tokens(&map, &[Token::Map { len: Some(0) }, Token::MapEnd]);
82    }
83
84    #[test]
85    fn ser_de() {
86        let map = VecMap::from([("a", 1), ("b", 2), ("c", 3)]);
87        assert_tokens(
88            &map,
89            &[
90                Token::Map { len: Some(3) },
91                Token::BorrowedStr("a"),
92                Token::I32(1),
93                Token::BorrowedStr("b"),
94                Token::I32(2),
95                Token::BorrowedStr("c"),
96                Token::I32(3),
97                Token::MapEnd,
98            ],
99        );
100    }
101}