xmlity/types/
tuples.rs

1use crate::{de, ser::SerializeSeq, Deserialize, Deserializer, Serialize};
2
3macro_rules! impl_serialize_tuple {
4    (@impl $(($name:ident, $index:tt)),+) => {
5        impl<$($name: Serialize),+> Serialize for ($($name,)+) {
6            fn serialize<S: crate::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
7                let mut seq = serializer.serialize_seq()?;
8                $(seq.serialize_element(&self.$index)?;)+
9                seq.end()
10            }
11        }
12    };
13    //Recursive case
14    (($first_name:ident, $first_index:tt) $(,($name:ident, $index:tt))*) => {
15        impl_serialize_tuple!(@impl ($first_name, $first_index) $(,($name, $index))*);
16        impl_serialize_tuple!($(($name, $index)),*);
17    };
18    //Base case
19    () => {};
20}
21
22impl_serialize_tuple!(
23    (T16, 15),
24    (T15, 14),
25    (T14, 13),
26    (T13, 12),
27    (T12, 11),
28    (T11, 10),
29    (T10, 9),
30    (T9, 8),
31    (T8, 7),
32    (T7, 6),
33    (T6, 5),
34    (T5, 4),
35    (T4, 3),
36    (T3, 2),
37    (T2, 1),
38    (T1, 0)
39);
40
41macro_rules! impl_deserialize_tuple {
42    (@impl $(($name:ident)),+) => {
43        impl<'de, $($name: Deserialize<'de>),*> Deserialize<'de> for ($($name,)*) {
44            fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
45                struct __Visitor<'__visitor, $($name),*> {
46                    marker: ::core::marker::PhantomData<($($name,)*)>,
47                    lifetime: ::core::marker::PhantomData<&'__visitor ()>,
48                }
49                impl<'__visitor, $($name: Deserialize<'__visitor>),*> de::Visitor<'__visitor> for __Visitor<'__visitor, $($name),*> {
50                    type Value = ($($name,)*);
51                    fn expecting(&self, formatter: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
52                        ::core::fmt::Formatter::write_str(formatter, "tuple")
53                    }
54                    fn visit_seq<S>(self, mut seq: S) -> Result<Self::Value, S::Error>
55                    where
56                        S: crate::de::SeqAccess<'__visitor>,
57                    {
58                        Ok(($(
59                            seq.next_element_seq::<$name>()?.ok_or_else(de::Error::missing_data)?,
60                        )*))
61                    }
62                    fn visit_none<E>(self) -> Result<Self::Value, E>
63                    where
64                        E: de::Error,
65                    {
66                        Ok(($(
67                            <$name as Deserialize<'__visitor>>::deserialize(crate::types::utils::NoneDeserializer::new())?,
68                        )*))
69                    }
70                }
71                deserializer.deserialize_seq(__Visitor {
72                    marker: ::core::marker::PhantomData,
73                    lifetime: ::core::marker::PhantomData,
74                })
75            }
76        }
77    };
78    //Recursive case
79    (($first_name:ident) $(,($name:ident))*) => {
80        impl_deserialize_tuple!(@impl ($first_name) $(,($name))*);
81        impl_deserialize_tuple!($(($name)),*);
82    };
83    //Base case
84    () => {};
85}
86
87impl_deserialize_tuple!(
88    (T16),
89    (T15),
90    (T14),
91    (T13),
92    (T12),
93    (T11),
94    (T10),
95    (T9),
96    (T8),
97    (T7),
98    (T6),
99    (T5),
100    (T4),
101    (T3),
102    (T2),
103    (T1)
104);