1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
use serde::de::Error; use serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; use std::fmt; use std::hash::{BuildHasher, Hash}; use std::marker::PhantomData; use NonEmptyIndexMap; struct CustomMapVisitor<K, V, S> { marker: PhantomData<(K, V, S)>, } impl<K, V, S> CustomMapVisitor<K, V, S> { fn new() -> Self { CustomMapVisitor { marker: PhantomData, } } } impl<'de, K, V, S> Visitor<'de> for CustomMapVisitor<K, V, S> where K: Deserialize<'de>, V: Deserialize<'de>, K: Eq + Hash, S: BuildHasher + Default, { type Value = NonEmptyIndexMap<K, V, S>; fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { formatter.write_str("a non-empty map") } fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error> where M: MapAccess<'de>, { let size_hint = access.size_hint().unwrap_or(0); let mut map = if let Some((key, value)) = access.next_entry()? { NonEmptyIndexMap::with_capacity_and_hasher(key, value, size_hint, S::default()) } else { return Err(M::Error::invalid_length(0, &self)); }; while let Some((key, value)) = access.next_entry()? { map.insert(key, value); } Ok(map) } } impl<'de, K, V, S> Deserialize<'de> for NonEmptyIndexMap<K, V, S> where K: Deserialize<'de>, V: Deserialize<'de>, K: Eq + Hash, S: BuildHasher + Default, { fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> where D: Deserializer<'de>, { deserializer.deserialize_map(CustomMapVisitor::new()) } }