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