1use super::{PlatformVersionedBorrowDecode, PlatformVersionedDecode};
2use bincode::de::{BorrowDecoder, Decoder};
3use bincode::error::DecodeError;
4use platform_version::version::PlatformVersion;
5
6macro_rules! impl_tuple {
7 () => {};
8 ($first:ident $(, $extra:ident)*) => {
9 impl<'de, $first $(, $extra)*> PlatformVersionedBorrowDecode<'de> for ($first, $($extra, )*)
10 where
11 $first: PlatformVersionedBorrowDecode<'de>,
12 $(
13 $extra : PlatformVersionedBorrowDecode<'de>,
14 )*
15 {
16 fn platform_versioned_borrow_decode<BD: BorrowDecoder<'de, Context = crate::BincodeContext>>(decoder: &mut BD, platform_version: &PlatformVersion) -> Result<Self, DecodeError> {
17 Ok((
18 $first::platform_versioned_borrow_decode(decoder, platform_version)?,
19 $($extra :: platform_versioned_borrow_decode(decoder, platform_version)?, )*
20 ))
21 }
22 }
23
24 impl<$first $(, $extra)*> PlatformVersionedDecode for ($first, $($extra, )*)
25 where
26 $first: PlatformVersionedDecode,
27 $(
28 $extra : PlatformVersionedDecode,
29 )*
30 {
31 fn platform_versioned_decode<DE: Decoder<Context = crate::BincodeContext>>(decoder: &mut DE, platform_version: &PlatformVersion) -> Result<Self, DecodeError> {
32 Ok((
33 $first::platform_versioned_decode(decoder, platform_version)?,
34 $($extra :: platform_versioned_decode(decoder, platform_version)?, )*
35 ))
36 }
37 }
38 }
39}
40
41impl_tuple!(A);
42impl_tuple!(A, B);
43impl_tuple!(A, B, C);
44impl_tuple!(A, B, C, D);
45impl_tuple!(A, B, C, D, E);
46impl_tuple!(A, B, C, D, E, F);
47impl_tuple!(A, B, C, D, E, F, G);
48impl_tuple!(A, B, C, D, E, F, G, H);
49impl_tuple!(A, B, C, D, E, F, G, H, I);
50impl_tuple!(A, B, C, D, E, F, G, H, I, J);
51impl_tuple!(A, B, C, D, E, F, G, H, I, J, K);
52impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);
53impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M);
54impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N);
55impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O);
56impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P);
57
58#[cfg(test)]
59mod tests {
60 use bincode::config;
61 use platform_version::version::PlatformVersion;
62
63 fn cfg() -> impl bincode::config::Config {
64 config::standard().with_big_endian().with_no_limit()
65 }
66
67 fn pv() -> &'static PlatformVersion {
68 PlatformVersion::first()
69 }
70
71 #[test]
72 fn tuple_1_decode() {
73 let value: (u32,) = (42,);
74 let encoded = crate::platform_encode_to_vec(value, cfg(), pv()).unwrap();
75 let decoded: (u32,) =
76 crate::platform_versioned_decode_from_slice(&encoded, cfg(), pv()).unwrap();
77 assert_eq!(decoded, value);
78 }
79
80 #[test]
81 fn tuple_2_decode() {
82 let value: (u8, i16) = (255, -100);
83 let encoded = crate::platform_encode_to_vec(value, cfg(), pv()).unwrap();
84 let decoded: (u8, i16) =
85 crate::platform_versioned_decode_from_slice(&encoded, cfg(), pv()).unwrap();
86 assert_eq!(decoded, value);
87 }
88
89 #[test]
90 fn tuple_3_decode() {
91 let value: (bool, u32, i64) = (true, 42, -999);
92 let encoded = crate::platform_encode_to_vec(value, cfg(), pv()).unwrap();
93 let decoded: (bool, u32, i64) =
94 crate::platform_versioned_decode_from_slice(&encoded, cfg(), pv()).unwrap();
95 assert_eq!(decoded, value);
96 }
97
98 #[test]
99 fn tuple_borrow_decode() {
100 let value: (u8, u16) = (1, 2);
101 let encoded = crate::platform_encode_to_vec(value, cfg(), pv()).unwrap();
102 let decoded: (u8, u16) =
103 crate::platform_versioned_borrow_decode_from_slice(&encoded, cfg(), pv()).unwrap();
104 assert_eq!(decoded, value);
105 }
106}