1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, DynIntrospectable, Introspectable, LexicalId, References};
3use crate::tags::{PrimaryTag, Tag};
4use crate::{Deserialize, DeserializeError, Deserializer, Serialize, SerializeError, Serializer};
5
6macro_rules! impl_tuple {
7 { $len:literal, $( ($tag:ident, $gen:ident, $idx:tt) ),+ } => {
8 impl<$( $tag: Tag ),+> Tag for ($( $tag ,)+) { }
9
10 impl<$( $tag: PrimaryTag ),+> PrimaryTag for ($( $tag ,)+) {
11 type Tag = ($( $tag::Tag ,)+);
12 }
13
14 impl<$( $tag, $gen ),+> Serialize<($( $tag ,)+)> for ($( $gen ,)+)
15 where
16 $(
17 $tag: Tag,
18 $gen: Serialize<$tag>,
19 )+
20 {
21 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
22 let mut serializer = serializer.serialize_struct2()?;
23
24 $(
25 serializer.serialize($idx as u32, self.$idx)?;
26 )+
27
28 serializer.finish()
29 }
30 }
31
32 impl<$( $tag, $gen ),+> Deserialize<($( $tag ,)+)> for ($( $gen ,)+)
33 where
34 $(
35 $tag: Tag,
36 $gen: Deserialize<$tag>,
37 )+
38 {
39 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
40 let mut deserializer = deserializer.deserialize_struct()?;
41
42 $(
43 #[allow(non_snake_case)]
44 let mut $gen = None;
45 )+
46
47 while let Some(deserializer) = deserializer.deserialize()? {
48 match deserializer.id() {
49 $( $idx => $gen = deserializer.deserialize().map(Some)?, )+
50 _ => return Err(DeserializeError::InvalidSerialization),
51 }
52 }
53
54 deserializer.finish_with(|_| {
55 Ok(($( $gen.ok_or(DeserializeError::InvalidSerialization)?, )+))
56 })
57 }
58 }
59
60 impl<'a, $( $tag, $gen ),+> Serialize<($( $tag ,)+)> for &'a ($( $gen ,)+)
61 where
62 $(
63 $tag: Tag,
64 &'a $gen: Serialize<$tag>,
65 )+
66 {
67 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
68 let mut serializer = serializer.serialize_struct2()?;
69
70 $(
71 serializer.serialize($idx as u32, &self.$idx)?;
72 )+
73
74 serializer.finish()
75 }
76 }
77
78 #[cfg(feature = "introspection")]
79 impl<$( $gen ),+> Introspectable for ($( $gen, )+)
80 where
81 $( $gen: Introspectable ),+
82 {
83 fn layout() -> ir::LayoutIr {
84 ir::StructIr::builder("std", concat!("Tuple", $len))
85 $(
86 .field(
87 ir::FieldIr::builder(
88 $idx,
89 concat!("field", $idx),
90 true,
91 $gen::lexical_id(),
92 )
93 .finish(),
94 )
95 )+
96 .finish()
97 .into()
98 }
99
100 fn lexical_id() -> LexicalId {
101 LexicalId::custom_generic(
102 "std",
103 concat!("Tuple", $len),
104 &[$( $gen::lexical_id() ),+],
105 )
106 }
107
108 fn add_references(references: &mut References) {
109 let types: [DynIntrospectable; $len] = [
110 $( DynIntrospectable::new::<$gen>() ),+
111 ];
112
113 references.extend(types);
114 }
115 }
116 };
117}
118
119impl_tuple! { 1, (T0, U0, 0) }
120impl_tuple! { 2, (T0, U0, 0), (T1, U1, 1) }
121impl_tuple! { 3, (T0, U0, 0), (T1, U1, 1), (T2, U2, 2) }
122impl_tuple! { 4, (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3) }
123impl_tuple! { 5, (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4) }
124impl_tuple! { 6, (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5) }
125
126impl_tuple! {
127 7,
128 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6)
129}
130
131impl_tuple! {
132 8,
133 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6),
134 (T7, U7, 7)
135}
136
137impl_tuple! {
138 9,
139 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6),
140 (T7, U7, 7), (T8, U8, 8)
141}
142
143impl_tuple! {
144 10,
145 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6),
146 (T7, U7, 7), (T8, U8, 8), (T9, U9, 9)
147}
148
149impl_tuple! {
150 11,
151 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6),
152 (T7, U7, 7), (T8, U8, 8), (T9, U9, 9), (T10, U10, 10)
153}
154
155impl_tuple! {
156 12,
157 (T0, U0, 0), (T1, U1, 1), (T2, U2, 2), (T3, U3, 3), (T4, U4, 4), (T5, U5, 5), (T6, U6, 6),
158 (T7, U7, 7), (T8, U8, 8), (T9, U9, 9), (T10, U10, 10), (T11, U11, 11)
159}