non_empty_collections/index_map/
deserialize.rs

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