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