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::{
9    Serialize,
10    error::{DecodeError, EncodeError},
11    read_write::{Read, Write},
12};
13
14/// Implements Serialize for a tuple type.
15///
16/// This macro takes a list of generic type identifiers (e.g., T, U, V).
17macro_rules! impl_serialize_tuple {
18    ($($T:ident),*) => { paste! {
19        impl<$($T: Serialize),*> Serialize for ($($T),*) {
20            fn encode(&self, dest: &mut Vec<u8>) -> Result<(), EncodeError> {
21                let ($([<$T:lower>]),*) = self;
22                $(
23                    dest.write([<$T:lower>])?;
24                )*
25                Ok(())
26            }
27
28            fn decode(src: &mut Tape<'_, u8>) -> Result<Self, DecodeError> {
29                Ok(($(
30                    src.read::<$T>()?
31                ),*))
32            }
33        }
34    }};
35}
36
37impl_serialize_tuple!(T, U);
38impl_serialize_tuple!(T, U, V);