perde_core/decode/
dict.rs1use 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}