Skip to main content

perde_core/decode/
tuple.rs

1use crate::{
2    error::Convert,
3    schema::*,
4    types::{self, Object},
5};
6use serde::de::{DeserializeSeed, Deserializer, IgnoredAny, SeqAccess, Visitor};
7use smallvec::SmallVec;
8use std::fmt;
9
10pub struct TupleVisitor<'a>(pub &'a Tuple);
11
12impl<'a, 'de> Visitor<'de> for TupleVisitor<'a> {
13    type Value = Object;
14
15    fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
16        write!(f, "a tuple")
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        let mut args = self.0.args.iter().fuse();
26
27        loop {
28            if let Some(schema) = args.next() {
29                match seq.next_element_seed(schema)? {
30                    Some(value) => items.push(value),
31                    None => break,
32                }
33            } else {
34                let _: IgnoredAny = match seq.next_element()? {
35                    Some(value) => value,
36                    None => break,
37                };
38            }
39        }
40
41        let mut tuple = types::Tuple::new(items.len()).de()?;
42        for (i, a) in items.into_iter().enumerate() {
43            tuple.set(i, a);
44        }
45
46        Ok(tuple.into_inner())
47    }
48}
49
50impl<'a, 'de> DeserializeSeed<'de> for &'a Tuple {
51    type Value = Object;
52
53    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
54    where
55        D: Deserializer<'de>,
56    {
57        deserializer.deserialize_seq(TupleVisitor(self))
58    }
59}