1use crate::descriptors::{Descriptor, TypePos};
2use crate::errors::DecodeError;
3use crate::queryable::DescriptorMismatch;
4use crate::queryable::{Decoder, DescriptorContext, Queryable};
5use crate::serialization::decode::DecodeTupleLike;
6
7macro_rules! implement_tuple {
8 ( $count:expr, $(($name:ident, $index:tt),)+ ) => (
9 impl<$($name:Queryable),+> Queryable for ($($name,)+) {
10 type Args = (
11 $(
12 <$name as crate::queryable::Queryable>::Args,
13 )+
14 );
15
16 fn decode(decoder: &Decoder, args: &Self::Args, buf: &[u8])
17 -> Result<Self, DecodeError>
18 {
19 let mut elements = DecodeTupleLike::new_tuple(buf, $count)?;
20 Ok((
21 $(
22 <$name as crate::queryable::Queryable>::
23 decode_optional(decoder, &args.$index, elements.read()?)?,
24 )+
25 ))
26 }
27
28 fn check_descriptor(ctx: &DescriptorContext, type_pos: TypePos)
29 -> Result<Self::Args, DescriptorMismatch>
30 {
31 let desc = ctx.get(type_pos)?;
32 match desc {
33 Descriptor::Tuple(desc) => {
34 if desc.element_types.len() != $count {
35 return Err(ctx.field_number($count, desc.element_types.len()));
36 }
37 let mut element_types = desc.element_types.iter().copied();
38 Ok((
39 $($name::check_descriptor(ctx, element_types.next().unwrap())?,)+
40 ))
41 }
42 _ => Err(ctx.wrong_type(desc, "tuple"))
43 }
44 }
45 }
46 )
47}
48
49implement_tuple! {
50 1,
51 (T0, 0),
52}
53implement_tuple! {
54 2,
55 (T0, 0),
56 (T1, 1),
57}
58implement_tuple! {
59 3,
60 (T0, 0),
61 (T1, 1),
62 (T2, 2),
63}
64implement_tuple! {
65 4,
66 (T0, 0),
67 (T1, 1),
68 (T2, 2),
69 (T3, 3),
70}
71implement_tuple! {
72 5,
73 (T0, 0),
74 (T1, 1),
75 (T2, 2),
76 (T3, 3),
77 (T4, 4),
78}
79implement_tuple! {
80 6,
81 (T0, 0),
82 (T1, 1),
83 (T2, 2),
84 (T3, 3),
85 (T4, 4),
86 (T5, 5),
87}
88implement_tuple! {
89 7,
90 (T0, 0),
91 (T1, 1),
92 (T2, 2),
93 (T3, 3),
94 (T4, 4),
95 (T5, 5),
96 (T6, 6),
97}
98implement_tuple! {
99 8,
100 (T0, 0),
101 (T1, 1),
102 (T2, 2),
103 (T3, 3),
104 (T4, 4),
105 (T5, 5),
106 (T6, 6),
107 (T7, 7),
108}
109implement_tuple! {
110 9,
111 (T0, 0),
112 (T1, 1),
113 (T2, 2),
114 (T3, 3),
115 (T4, 4),
116 (T5, 5),
117 (T6, 6),
118 (T7, 7),
119 (T8, 8),
120}
121implement_tuple! {
122 10,
123 (T0, 0),
124 (T1, 1),
125 (T2, 2),
126 (T3, 3),
127 (T4, 4),
128 (T5, 5),
129 (T6, 6),
130 (T7, 7),
131 (T8, 8),
132 (T9, 9),
133}
134implement_tuple! {
135 11,
136 (T0, 0),
137 (T1, 1),
138 (T2, 2),
139 (T3, 3),
140 (T4, 4),
141 (T5, 5),
142 (T6, 6),
143 (T7, 7),
144 (T8, 8),
145 (T9, 9),
146 (T10, 10),
147}
148implement_tuple! {
149 12,
150 (T0, 0),
151 (T1, 1),
152 (T2, 2),
153 (T3, 3),
154 (T4, 4),
155 (T5, 5),
156 (T6, 6),
157 (T7, 7),
158 (T8, 8),
159 (T9, 9),
160 (T10, 10),
161 (T11, 11),
162}