1 use core::fmt;
2 use core::marker::PhantomData;
3 
4 use serde::de::{Deserialize, Deserializer, MapAccess, Visitor};
5 use serde::ser::{Serialize, SerializeMap, Serializer};
6 
7 use super::{builder::Builder, Slab};
8 
9 impl<T> Serialize for Slab<T>
10 where
11     T: Serialize,
12 {
serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer,13     fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14     where
15         S: Serializer,
16     {
17         let mut map_serializer = serializer.serialize_map(Some(self.len()))?;
18         for (key, value) in self {
19             map_serializer.serialize_key(&key)?;
20             map_serializer.serialize_value(value)?;
21         }
22         map_serializer.end()
23     }
24 }
25 
26 struct SlabVisitor<T>(PhantomData<T>);
27 
28 impl<'de, T> Visitor<'de> for SlabVisitor<T>
29 where
30     T: Deserialize<'de>,
31 {
32     type Value = Slab<T>;
33 
expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result34     fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
35         write!(fmt, "a map")
36     }
37 
visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> where A: MapAccess<'de>,38     fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
39     where
40         A: MapAccess<'de>,
41     {
42         let mut builder = Builder::with_capacity(map.size_hint().unwrap_or(0));
43 
44         while let Some((key, value)) = map.next_entry()? {
45             builder.pair(key, value)
46         }
47 
48         Ok(builder.build())
49     }
50 }
51 
52 impl<'de, T> Deserialize<'de> for Slab<T>
53 where
54     T: Deserialize<'de>,
55 {
deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>,56     fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
57     where
58         D: Deserializer<'de>,
59     {
60         deserializer.deserialize_map(SlabVisitor(PhantomData))
61     }
62 }
63