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}