use std::{ fmt::{self, Formatter}, hash::{BuildHasher, Hash}, marker::PhantomData, }; use serde::{ de::{MapAccess, SeqAccess, Visitor}, ser::{SerializeMap, SerializeSeq}, Deserialize, Deserializer, Serialize, Serializer, }; use crate::{LinkedHashMap, LinkedHashSet}; // LinkedHashMap impls impl Serialize for LinkedHashMap where K: Serialize + Eq + Hash, V: Serialize, S: BuildHasher, { #[inline] fn serialize(&self, serializer: T) -> Result { let mut map_serializer = serializer.serialize_map(Some(self.len()))?; for (k, v) in self { map_serializer.serialize_key(k)?; map_serializer.serialize_value(v)?; } map_serializer.end() } } impl<'de, K, V, S> Deserialize<'de> for LinkedHashMap where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, S: BuildHasher + Default, { fn deserialize>(deserializer: D) -> Result { #[derive(Debug)] pub struct LinkedHashMapVisitor { marker: PhantomData>, } impl LinkedHashMapVisitor { fn new() -> Self { LinkedHashMapVisitor { marker: PhantomData, } } } impl Default for LinkedHashMapVisitor { fn default() -> Self { Self::new() } } impl<'de, K, V, S> Visitor<'de> for LinkedHashMapVisitor where K: Deserialize<'de> + Eq + Hash, V: Deserialize<'de>, S: BuildHasher + Default, { type Value = LinkedHashMap; fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { write!(formatter, "a map") } #[inline] fn visit_map>(self, mut map: M) -> Result { let mut values = LinkedHashMap::with_capacity_and_hasher( map.size_hint().unwrap_or(0), S::default(), ); while let Some((k, v)) = map.next_entry()? { values.insert(k, v); } Ok(values) } } deserializer.deserialize_map(LinkedHashMapVisitor::default()) } } // LinkedHashSet impls impl Serialize for LinkedHashSet where T: Serialize + Eq + Hash, S: BuildHasher, { #[inline] fn serialize(&self, serializer: U) -> Result { let mut seq_serializer = serializer.serialize_seq(Some(self.len()))?; for v in self { seq_serializer.serialize_element(v)?; } seq_serializer.end() } } impl<'de, T, S> Deserialize<'de> for LinkedHashSet where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default, { fn deserialize>(deserializer: D) -> Result { #[derive(Debug)] pub struct LinkedHashSetVisitor { marker: PhantomData>, } impl LinkedHashSetVisitor { fn new() -> Self { LinkedHashSetVisitor { marker: PhantomData, } } } impl Default for LinkedHashSetVisitor { fn default() -> Self { Self::new() } } impl<'de, T, S> Visitor<'de> for LinkedHashSetVisitor where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default, { type Value = LinkedHashSet; fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { write!(formatter, "a sequence") } #[inline] fn visit_seq>(self, mut seq: SA) -> Result { let mut values = LinkedHashSet::with_capacity_and_hasher( seq.size_hint().unwrap_or(0), S::default(), ); while let Some(v) = seq.next_element()? { values.insert(v); } Ok(values) } } deserializer.deserialize_seq(LinkedHashSetVisitor::default()) } }