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)
}