non_empty_collections/index_set/
deserialize.rs1use 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}