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}