sbor/codec/
tuple.rs

1use crate::value_kind::*;
2use crate::*;
3
4macro_rules! categorize_tuple {
5    ($n:tt$( $idx:tt $name:ident)*) => {
6        impl<X: CustomValueKind$(, $name)*> Categorize<X> for ($($name,)*) {
7            #[inline]
8            fn value_kind() -> ValueKind<X> {
9                ValueKind::Tuple
10            }
11        }
12
13        impl<X: CustomValueKind$(, $name)*> SborTuple<X> for ($($name,)*) {
14            fn get_length(&self) -> usize {
15                $n
16            }
17        }
18    };
19}
20
21categorize_tuple! { 0 } // Unit
22categorize_tuple! { 1 0 A }
23categorize_tuple! { 2 0 A 1 B }
24categorize_tuple! { 3 0 A 1 B 2 C }
25categorize_tuple! { 4 0 A 1 B 2 C 3 D }
26categorize_tuple! { 5 0 A 1 B 2 C 3 D 4 E }
27categorize_tuple! { 6 0 A 1 B 2 C 3 D 4 E 5 F }
28categorize_tuple! { 7 0 A 1 B 2 C 3 D 4 E 5 F 6 G }
29categorize_tuple! { 8 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H }
30categorize_tuple! { 9 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I }
31categorize_tuple! { 10 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J }
32categorize_tuple! { 11 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K  }
33categorize_tuple! { 12 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L   }
34categorize_tuple! { 13 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M  }
35categorize_tuple! { 14 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N  }
36categorize_tuple! { 15 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O  }
37categorize_tuple! { 16 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P  }
38categorize_tuple! { 17 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q   }
39categorize_tuple! { 18 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R  }
40categorize_tuple! { 19 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S  }
41categorize_tuple! { 20 0 A 1 B 2 C 3 D 4 E 5 F 6 G 7 H 8 I 9 J 10 K 11 L 12 M 13 N 14 O 15 P 16 Q 17 R 18 S 19 T  }
42
43macro_rules! encode_tuple {
44    ($n:tt$( $idx:tt $name:ident)*) => {
45        impl<X: CustomValueKind, E: Encoder<X>$(, $name: Encode<X, E>)*> Encode<X, E> for ($($name,)*) {
46            #[inline]
47            fn encode_value_kind(&self, encoder: &mut E) -> Result<(), EncodeError> {
48                encoder.write_value_kind(Self::value_kind())
49            }
50
51            #[inline]
52            fn encode_body(&self, encoder: &mut E) -> Result<(), EncodeError> {
53                encoder.write_size($n)?;
54                $(encoder.encode(&self.$idx)?;)*
55                Ok(())
56            }
57        }
58    };
59}
60
61encode_tuple! { 0 } // Unit
62encode_tuple! { 1 0 T0 }
63encode_tuple! { 2 0 T0 1 T1 }
64encode_tuple! { 3 0 T0 1 T1 2 T2 }
65encode_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
66encode_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
67encode_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
68encode_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
69encode_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
70encode_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
71encode_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
72encode_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
73encode_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
74encode_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
75encode_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
76encode_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
77encode_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
78encode_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
79encode_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
80encode_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
81encode_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
82
83macro_rules! decode_tuple {
84    ($n:tt$( $idx:tt $name:ident)*) => {
85        impl<X: CustomValueKind, D: Decoder<X>$(, $name: Decode<X, D>)*> Decode<X, D> for ($($name,)*) {
86            #[inline]
87            fn decode_body_with_value_kind(decoder: &mut D, value_kind: ValueKind<X>) -> Result<Self, DecodeError> {
88                decoder.check_preloaded_value_kind(value_kind, Self::value_kind())?;
89                decoder.read_and_check_size($n)?;
90
91                Ok(($(decoder.decode::<$name>()?,)*))
92            }
93        }
94    };
95}
96
97decode_tuple! { 0 } // Unit
98decode_tuple! { 1 0 T0 }
99decode_tuple! { 2 0 T0 1 T1 }
100decode_tuple! { 3 0 T0 1 T1 2 T2 }
101decode_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
102decode_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
103decode_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
104decode_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
105decode_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
106decode_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
107decode_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
108decode_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
109decode_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
110decode_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
111decode_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
112decode_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
113decode_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
114decode_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
115decode_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
116decode_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
117decode_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
118
119mod schema {
120    use super::*;
121    macro_rules! describe_tuple {
122        ($n:tt$( $idx:tt $name:ident)*) => {
123            impl<C: CustomTypeKind<RustTypeId>$(, $name: Describe<C>)*> Describe<C> for ($($name,)*) {
124                const TYPE_ID: RustTypeId = RustTypeId::novel("Tuple", &[$($name::TYPE_ID),*]);
125
126                fn type_data() -> TypeData<C, RustTypeId> {
127                    TypeData::unnamed(
128                        TypeKind::Tuple {
129                            field_types: crate::rust::vec![
130                                $($name::TYPE_ID,)*
131                            ]
132                        }
133                    )
134                }
135
136                #[allow(unused_variables)] // For the unit case
137                fn add_all_dependencies(aggregator: &mut TypeAggregator<C>) {
138                    $(aggregator.add_child_type_and_descendents::<$name>();)*
139                }
140            }
141        };
142    }
143
144    describe_basic_well_known_type!((), UNIT_TYPE, unit_type_data);
145    describe_tuple! { 1 0 T0 }
146    describe_tuple! { 2 0 T0 1 T1 }
147    describe_tuple! { 3 0 T0 1 T1 2 T2 }
148    describe_tuple! { 4 0 T0 1 T1 2 T2 3 T3 }
149    describe_tuple! { 5 0 T0 1 T1 2 T2 3 T3 4 T4 }
150    describe_tuple! { 6 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 }
151    describe_tuple! { 7 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 }
152    describe_tuple! { 8 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 }
153    describe_tuple! { 9 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 }
154    describe_tuple! { 10 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 }
155    describe_tuple! { 11 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 }
156    describe_tuple! { 12 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 }
157    describe_tuple! { 13 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 }
158    describe_tuple! { 14 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 }
159    describe_tuple! { 15 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 }
160    describe_tuple! { 16 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 }
161    describe_tuple! { 17 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 }
162    describe_tuple! { 18 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 }
163    describe_tuple! { 19 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 }
164    describe_tuple! { 20 0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19 }
165}