tuple/
m_serde.rs

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);