gel_protocol/serialization/decode/queryable/
tuples.rs

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}