aldrin_core/impls/
tuple.rs

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}