Skip to main content

perde_core/decode/
set.rs

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