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