casserole 0.2.0

Break and serialize values into content-addressable storage
Documentation
use crate::{ser::Casserole, store::Store};

macro_rules! tuple_type {
    ($($letters:ident: $numbers:tt),*) => {
        impl<S, $($letters),*> Casserole<S> for ($($letters),*)
        where
            S: Store,
            $($letters: Casserole<S>),*
        {
            type Target = (
                $(<$letters as Casserole<S>>::Target),*
            );

            fn casserole(&self, store: &mut S) -> Result<Self::Target, S::Error> {
                Ok((
                    $(self.$numbers.casserole(store)?),*
                ))
            }

            fn decasserole(target: &Self::Target, store: &mut S) -> Result<Self, S::Error> {
                Ok((
                    $(
                        (<$letters as Casserole<S>>::decasserole(
                            &target.$numbers,
                            store,
                        ))?
                    ),*
                ))
            }
        }
    };
}

tuple_type!{A:0 , B:1}
tuple_type!{A:0 , B:1 , C:2}
tuple_type!{A:0 , B:1 , C:2, D:3}