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