Skip to main content

bincake_core/
serialize_tuple.rs

1//! Implements `Serialize`` for arbitrary tuples of various sizes.
2//!
3//! Currently supports tuples of size 2 and 3.
4
5use pastey::paste;
6use taped::Tape;
7
8use crate::{DecodeError, EncodeError, Read, Serialize, Write};
9
10/// Implements Serialize for a tuple type.
11///
12/// This macro takes a list of generic type identifiers (e.g., T, U, V).
13macro_rules! impl_serialize_tuple {
14    ($($T:ident),*) => { paste! {
15        impl<$($T: Serialize),*> Serialize for ($($T),*) {
16            fn encode(&self, dest: &mut Vec<u8>) -> Result<(), EncodeError> {
17                let ($([<$T:lower>]),*) = self;
18                $(
19                    dest.write([<$T:lower>])?;
20                )*
21                Ok(())
22            }
23
24            fn decode(src: &mut Tape<'_, u8>) -> Result<Self, DecodeError> {
25                Ok(($(
26                    src.read::<$T>()?
27                ),*))
28            }
29        }
30    }};
31}
32
33impl_serialize_tuple!(T, U);
34impl_serialize_tuple!(T, U, V);