platform_serialization/de/
impl_tuples.rs

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}