klever_sc_codec/impl_for_types/
impl_tuple.rs1use crate::{
2 top_decode_from_nested_or_handle_err, DecodeErrorHandler, EncodeErrorHandler, NestedDecode,
3 NestedDecodeInput, NestedEncode, NestedEncodeOutput, TopDecode, TopDecodeInput, TopEncode,
4 TopEncodeOutput,
5};
6
7macro_rules! tuple_impls {
8 ($(($($n:tt $name:ident)+))+) => {
9 $(
10 impl<$($name),+> TopEncode for ($($name,)+)
11 where
12 $($name: NestedEncode,)+
13 {
14 fn top_encode_or_handle_err<O, H>(&self, output: O, h: H) -> Result<(), H::HandledErr>
15 where
16 O: TopEncodeOutput,
17 H: EncodeErrorHandler,
18 {
19 let mut buffer = output.start_nested_encode();
20 $(
21 self.$n.dep_encode_or_handle_err(&mut buffer, h)?;
22 )+
23 output.finalize_nested_encode(buffer);
24 Ok(())
25 }
26 }
27
28 impl<$($name),+> TopDecode for ($($name,)+)
29 where
30 $($name: NestedDecode,)+
31 {
32 fn top_decode_or_handle_err<I, H>(input: I, h: H) -> Result<Self, H::HandledErr>
33 where
34 I: TopDecodeInput,
35 H: DecodeErrorHandler,
36 {
37 top_decode_from_nested_or_handle_err(input, h)
38 }
39 }
40
41 impl<$($name),+> NestedEncode for ($($name,)+)
42 where
43 $($name: NestedEncode,)+
44 {
45 fn dep_encode_or_handle_err<O, H>(&self, dest: &mut O, h: H) -> Result<(), H::HandledErr>
46 where
47 O: NestedEncodeOutput,
48 H: EncodeErrorHandler,
49 {
50 $(
51 self.$n.dep_encode_or_handle_err(dest, h)?;
52 )+
53 Ok(())
54 }
55 }
56
57 impl<$($name),+> NestedDecode for ($($name,)+)
58 where
59 $($name: NestedDecode,)+
60 {
61 fn dep_decode_or_handle_err<I, H>(input: &mut I, h: H) -> Result<Self, H::HandledErr>
62 where
63 I: NestedDecodeInput,
64 H: DecodeErrorHandler,
65 {
66 Ok((
67 $(
68 $name::dep_decode_or_handle_err(input, h)?,
69 )+
70 ))
71 }
72 }
73 )+
74 }
75}
76
77tuple_impls! {
78 (0 T0)
79 (0 T0 1 T1)
80 (0 T0 1 T1 2 T2)
81 (0 T0 1 T1 2 T2 3 T3)
82 (0 T0 1 T1 2 T2 3 T3 4 T4)
83 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5)
84 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6)
85 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7)
86 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8)
87 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9)
88 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10)
89 (0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11)
90 (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)
91 (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)
92 (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)
93 (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)
94}
95
96#[cfg(test)]
97mod tests {
98 use crate::test_util::{check_dep_encode_decode, check_top_encode_decode};
99
100 #[test]
101 fn test_top() {
102 let t = (1i8, 2u32, 3i16);
103 let expected: &[u8] = &[1, 0, 0, 0, 2, 0, 3];
104 check_top_encode_decode(t, expected);
105 }
106 #[test]
107 fn test_dep() {
108 let t = (1i8, 2u32, 3i16);
109 let expected: &[u8] = &[1, 0, 0, 0, 2, 0, 3];
110 check_dep_encode_decode(t, expected);
111 }
112}