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 (($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 () => {};
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 (($first_name:ident) $(,($name:ident))*) => {
80 impl_deserialize_tuple!(@impl ($first_name) $(,($name))*);
81 impl_deserialize_tuple!($(($name)),*);
82 };
83 () => {};
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);