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
use serde::{de, Deserializer};
use std::collections::HashMap;
use std::fmt;
pub(crate) fn deserialize_yes_map<'de, D>(
deserializer: D,
) -> Result<HashMap<String, bool>, D::Error>
where
D: Deserializer<'de>,
{
struct YesMapVisitor;
impl<'de> de::Visitor<'de> for YesMapVisitor {
type Value = HashMap<String, bool>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a yes map")
}
fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
where
A: de::MapAccess<'de>,
{
let mut values = if let Some(size) = map.size_hint() {
HashMap::with_capacity(size)
} else {
HashMap::new()
};
while let Some(key) = map.next_key::<String>()? {
let _: de::IgnoredAny = map.next_value()?;
values.insert(key, true);
}
Ok(values)
}
}
deserializer.deserialize_map(YesMapVisitor)
}