intmap/
serde.rs

1use crate::{IntKey, IntMap};
2use serde::{
3    de::{Deserializer, MapAccess, Visitor},
4    ser::SerializeMap,
5    Deserialize, Serialize, Serializer,
6};
7
8impl<K, V> Serialize for IntMap<K, V>
9where
10    K: IntKey + Serialize,
11    V: Serialize,
12{
13    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14    where
15        S: Serializer,
16    {
17        let mut map = serializer.serialize_map(Some(self.len()))?;
18        for (k, v) in self.iter() {
19            map.serialize_entry(&k, v)?;
20        }
21        map.end()
22    }
23}
24
25impl<'de, K, V> Deserialize<'de> for IntMap<K, V>
26where
27    K: IntKey + Deserialize<'de>,
28    V: Deserialize<'de>,
29{
30    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31    where
32        D: Deserializer<'de>,
33    {
34        deserializer.deserialize_map(IntMapVisitor::new())
35    }
36}
37
38struct IntMapVisitor<K: IntKey, V> {
39    marker: std::marker::PhantomData<fn() -> IntMap<K, V>>,
40}
41
42impl<K: IntKey, V> IntMapVisitor<K, V> {
43    fn new() -> Self {
44        IntMapVisitor {
45            marker: std::marker::PhantomData,
46        }
47    }
48}
49
50impl<'de, K, V> Visitor<'de> for IntMapVisitor<K, V>
51where
52    K: IntKey + Deserialize<'de>,
53    V: Deserialize<'de>,
54{
55    type Value = IntMap<K, V>;
56
57    fn expecting(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
58        write!(f, "IntMap<{}>", std::any::type_name::<V>())
59    }
60
61    fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
62    where
63        M: MapAccess<'de>,
64    {
65        let mut map = IntMap::with_capacity(access.size_hint().unwrap_or(0));
66
67        while let Some((key, value)) = access.next_entry()? {
68            map.insert(key, value);
69        }
70
71        Ok(map)
72    }
73}