Skip to main content

perde_core/decode/
list.rs

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