| use core::fmt; |
| use core::marker::PhantomData; |
| |
| use serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; |
| use serde::ser::{Serialize, SerializeMap, Serializer}; |
| |
| use super::{builder::Builder, Slab}; |
| |
| impl<T> Serialize for Slab<T> |
| where |
| T: Serialize, |
| { |
| fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> |
| where |
| S: Serializer, |
| { |
| let mut map_serializer = serializer.serialize_map(Some(self.len()))?; |
| for (key, value) in self { |
| map_serializer.serialize_key(&key)?; |
| map_serializer.serialize_value(value)?; |
| } |
| map_serializer.end() |
| } |
| } |
| |
| struct SlabVisitor<T>(PhantomData<T>); |
| |
| impl<'de, T> Visitor<'de> for SlabVisitor<T> |
| where |
| T: Deserialize<'de>, |
| { |
| type Value = Slab<T>; |
| |
| fn expecting(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { |
| write!(fmt, "a map") |
| } |
| |
| fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error> |
| where |
| A: MapAccess<'de>, |
| { |
| let mut builder = Builder::with_capacity(map.size_hint().unwrap_or(0)); |
| |
| while let Some((key, value)) = map.next_entry()? { |
| builder.pair(key, value) |
| } |
| |
| Ok(builder.build()) |
| } |
| } |
| |
| impl<'de, T> Deserialize<'de> for Slab<T> |
| where |
| T: Deserialize<'de>, |
| { |
| fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> |
| where |
| D: Deserializer<'de>, |
| { |
| deserializer.deserialize_map(SlabVisitor(PhantomData)) |
| } |
| } |