use crate::{ binary_heap::Kind as BinaryHeapKind, BinaryHeap, Deque, IndexMap, IndexSet, LinearMap, String, Vec, }; use core::{ fmt, hash::{Hash, Hasher}, marker::PhantomData, }; use hash32::BuildHasherDefault; use serde::de::{self, Deserialize, Deserializer, Error, MapAccess, SeqAccess}; // Sequential containers impl<'de, T, KIND, const N: usize> Deserialize<'de> for BinaryHeap where T: Ord + Deserialize<'de>, KIND: BinaryHeapKind, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, T, KIND, const N: usize>(PhantomData<(&'de (), T, KIND)>); impl<'de, T, KIND, const N: usize> de::Visitor<'de> for ValueVisitor<'de, T, KIND, N> where T: Ord + Deserialize<'de>, KIND: BinaryHeapKind, { type Value = BinaryHeap; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut values = BinaryHeap::new(); while let Some(value) = seq.next_element()? { if values.push(value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_seq(ValueVisitor(PhantomData)) } } impl<'de, T, S, const N: usize> Deserialize<'de> for IndexSet, N> where T: Eq + Hash + Deserialize<'de>, S: Hasher + Default, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, T, S, const N: usize>(PhantomData<(&'de (), T, S)>); impl<'de, T, S, const N: usize> de::Visitor<'de> for ValueVisitor<'de, T, S, N> where T: Eq + Hash + Deserialize<'de>, S: Hasher + Default, { type Value = IndexSet, N>; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut values = IndexSet::new(); while let Some(value) = seq.next_element()? { if values.insert(value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_seq(ValueVisitor(PhantomData)) } } impl<'de, T, const N: usize> Deserialize<'de> for Vec where T: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, T, const N: usize>(PhantomData<(&'de (), T)>); impl<'de, T, const N: usize> serde::de::Visitor<'de> for ValueVisitor<'de, T, N> where T: Deserialize<'de>, { type Value = Vec; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut values = Vec::new(); while let Some(value) = seq.next_element()? { if values.push(value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_seq(ValueVisitor(PhantomData)) } } impl<'de, T, const N: usize> Deserialize<'de> for Deque where T: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, T, const N: usize>(PhantomData<(&'de (), T)>); impl<'de, T, const N: usize> serde::de::Visitor<'de> for ValueVisitor<'de, T, N> where T: Deserialize<'de>, { type Value = Deque; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a sequence") } fn visit_seq(self, mut seq: A) -> Result where A: SeqAccess<'de>, { let mut values = Deque::new(); while let Some(value) = seq.next_element()? { if values.push_back(value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_seq(ValueVisitor(PhantomData)) } } // Dictionaries impl<'de, K, V, S, const N: usize> Deserialize<'de> for IndexMap, N> where K: Eq + Hash + Deserialize<'de>, V: Deserialize<'de>, S: Default + Hasher, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, K, V, S, const N: usize>(PhantomData<(&'de (), K, V, S)>); impl<'de, K, V, S, const N: usize> de::Visitor<'de> for ValueVisitor<'de, K, V, S, N> where K: Eq + Hash + Deserialize<'de>, V: Deserialize<'de>, S: Default + Hasher, { type Value = IndexMap, N>; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a map") } fn visit_map(self, mut map: A) -> Result where A: MapAccess<'de>, { let mut values = IndexMap::new(); while let Some((key, value)) = map.next_entry()? { if values.insert(key, value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_map(ValueVisitor(PhantomData)) } } impl<'de, K, V, const N: usize> Deserialize<'de> for LinearMap where K: Eq + Deserialize<'de>, V: Deserialize<'de>, { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, K, V, const N: usize>(PhantomData<(&'de (), K, V)>); impl<'de, K, V, const N: usize> de::Visitor<'de> for ValueVisitor<'de, K, V, N> where K: Eq + Deserialize<'de>, V: Deserialize<'de>, { type Value = LinearMap; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { formatter.write_str("a map") } fn visit_map(self, mut map: A) -> Result where A: MapAccess<'de>, { let mut values = LinearMap::new(); while let Some((key, value)) = map.next_entry()? { if values.insert(key, value).is_err() { return Err(A::Error::invalid_length(values.capacity() + 1, &self))?; } } Ok(values) } } deserializer.deserialize_map(ValueVisitor(PhantomData)) } } // String containers impl<'de, const N: usize> Deserialize<'de> for String { fn deserialize(deserializer: D) -> Result where D: Deserializer<'de>, { struct ValueVisitor<'de, const N: usize>(PhantomData<&'de ()>); impl<'de, const N: usize> de::Visitor<'de> for ValueVisitor<'de, N> { type Value = String; fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { write!(formatter, "a string no more than {} bytes long", N as u64) } fn visit_str(self, v: &str) -> Result where E: de::Error, { let mut s = String::new(); s.push_str(v) .map_err(|_| E::invalid_length(v.len(), &self))?; Ok(s) } fn visit_bytes(self, v: &[u8]) -> Result where E: de::Error, { let mut s = String::new(); s.push_str( core::str::from_utf8(v) .map_err(|_| E::invalid_value(de::Unexpected::Bytes(v), &self))?, ) .map_err(|_| E::invalid_length(v.len(), &self))?; Ok(s) } } deserializer.deserialize_str(ValueVisitor::<'de, N>(PhantomData)) } }