serry 0.1.0

Serry - the unstructured Serde.
Documentation
use impl_trait_for_tuples::impl_for_tuples;

use crate::{
    read::ReadResult, write::WriteResult, SerryInput, SerryOutput, SerryRead, SerrySized,
    SerryWrite,
};

#[impl_for_tuples(2)]
#[tuple_types_custom_trait_bound(SerryWrite)]
impl SerryWrite for Tuple {
    fn serry_write(&self, output: &mut impl SerryOutput) -> WriteResult<()> {
        for_tuples!(#(output.write_value(&self.Tuple)?;)*);
        Ok(())
    }
}

#[impl_for_tuples(2)]
#[tuple_types_custom_trait_bound(SerryRead)]
impl SerryRead for Tuple {
    fn serry_read(input: &mut impl SerryInput) -> ReadResult<Self> {
        Ok(for_tuples!((#(input.read_value()?),*)))
    }
}

#[impl_for_tuples(2)]
#[tuple_types_custom_trait_bound(SerrySized)]
impl SerrySized for Tuple {
    fn predict_size(&self) -> usize {
        let size = 0;
        for_tuples!(#(let size = size + self.Tuple.predict_size();)*);
        size
    }

    fn predict_constant_size() -> Option<usize> {
        let size = 0;

        for_tuples!(#(let size = size + match Tuple::predict_constant_size() {
            Some(v) => v,
            None => return None
        };)*);

        Some(size)
    }

    fn predict_constant_size_unchecked() -> usize {
        let size = 0;
        for_tuples!(#(let size = size + Tuple::predict_constant_size_unchecked();)*);
        size
    }
}