Skip to main content

perde_core/decode/
frozen_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 FrozenSetVisitor<'a>(pub &'a FrozenSet);
10
11impl<'a, 'de> Visitor<'de> for FrozenSetVisitor<'a> {
12    type Value = Object;
13
14    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
15        write!(f, "a frozen 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        let set = types::FrozenSet::from_iter(&set.into_inner()).de()?;
29        Ok(set.into_inner())
30    }
31}
32
33impl<'a, 'de> DeserializeSeed<'de> for &'a FrozenSet {
34    type Value = Object;
35
36    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
37    where
38        D: Deserializer<'de>,
39    {
40        deserializer.deserialize_seq(FrozenSetVisitor(self))
41    }
42}