non_empty_collections/index_set/
deserialize.rs

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