Skip to main content

perde_core/decode/
dict.rs

1use crate::{
2    error::Convert,
3    schema::*,
4    types::{self, Object},
5};
6use serde::de::{DeserializeSeed, Deserializer, MapAccess, Visitor};
7use std::fmt;
8
9pub struct DictVisitor<'a>(pub &'a Dict);
10
11impl<'a, 'de> Visitor<'de> for DictVisitor<'a> {
12    type Value = Object;
13
14    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
15        write!(f, "a map")
16    }
17
18    fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
19    where
20        M: MapAccess<'de>,
21    {
22        let mut dict = types::Dict::new().de()?;
23
24        while let Some(key) = access.next_key_seed(&*self.0.key)? {
25            let key: Object = key;
26            let value: Object = access.next_value_seed(&*self.0.value)?;
27            dict.set(key, value).de()?;
28        }
29
30        Ok(dict.into_inner())
31    }
32}
33
34impl<'a, 'de> DeserializeSeed<'de> for &'a Dict {
35    type Value = Object;
36
37    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
38    where
39        D: Deserializer<'de>,
40    {
41        deserializer.deserialize_map(DictVisitor(self))
42    }
43}