1use serde::ser::{Serialize, Serializer, SerializeTuple};
2use serde::de::{SeqAccess, Visitor, Deserializer, Deserialize, Error};
3use super::*;
4use core::marker::PhantomData;
5
6macro_rules! impl_serde {
7 ($($Tuple:ident $Arr:ident { $($T:ident . $t:ident . $idx:tt),* } )*) => ($(
8 impl<$($T),*> Serialize for $Tuple<$($T),*> where $( $T: Serialize ),* {
9 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
10 where S: Serializer
11 {
12 let len = $(a!(1, $idx)+)* 0;
13 let mut tuple = serializer.serialize_tuple(len)?;
14 $( tuple.serialize_element(&self.$idx)?; )*
15 tuple.end()
16 }
17 }
18 impl<'de, $($T),*> Deserialize<'de> for $Tuple<$($T),*> where $( $T: Deserialize<'de> ),* {
19 fn deserialize<De>(deserializer: De) -> Result<Self, De::Error>
20 where De: Deserializer<'de>
21 {
22 use core::fmt;
23 const LEN: usize = $(a!(1, $idx)+)* 0;
24
25 struct TupleVisitor<$($t),*>(PhantomData<($($t,)*)>);
26 impl<'df, $($t: Deserialize<'df>),*> Visitor<'df> for TupleVisitor<$($t),*> {
27 type Value = $Tuple<$($t),*>;
28 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
29 write!(formatter, "Tuple of length {}", LEN)
30 }
31 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
32 where A: SeqAccess<'df>
33 {
34 $( let $t = seq.next_element()?; )*
35
36 match ($($t,)* seq.next_element::<()>()?) {
37 ($(Some($t),)* None) => Ok($Tuple($($t),*)),
38 _ => Err(A::Error::invalid_length(LEN, &self))
39 }
40 }
41 }
42
43 deserializer.deserialize_map(TupleVisitor(PhantomData))
44 }
45 }
46 )*)
47}
48
49impl_tuple!(impl_serde);