npsd 0.2.0

Network payload serializer / deserializer framework
Documentation
use super::{Error, AsyncMiddleware, AsyncPayload, AsyncIntoPayload, AsyncFromPayload};

#[macro_export]
macro_rules! async_payload_tuple {
    (($(($T:ident, $i:tt)),+), $len:tt) => {
        impl<X: Send + Sync, $($T),+> AsyncIntoPayload<X> for ($($T,)+) 
            where
                $($T: AsyncIntoPayload<X> + Send + Sync,)+
        {
            async fn poll_into_payload<'m, Y: AsyncMiddleware<'m>>(&self, ctx: &mut X, next: &mut Y) -> Result<(), Error> {
                $(
                    next.poll_into_payload(&self.$i, ctx).await?;
                )+

                Ok(())
            }
        }

        impl<'a, X: Send + Sync, $($T),+> AsyncFromPayload<'a, X> for ($($T,)+) 
            where
                $($T: AsyncFromPayload<'a, X>,)+
        {
            async fn poll_from_payload<Y: AsyncMiddleware<'a>>(ctx: &mut X, next: &mut Y) -> Result<Self, Error> {
                Ok(($(
                    next.poll_from_payload::<X, $T>(ctx).await?,
                )+))
            }
        }

        impl<'a, X: Send + Sync, $($T),+> AsyncPayload<'a, X> for ($($T,)+) 
            where
                $($T: AsyncPayload<'a, X>,)+ {}
    };
}

async_payload_tuple!(((A, 0)), 1);
async_payload_tuple!(((A, 0), (B, 1)), 2);
async_payload_tuple!(((A, 0), (B, 1), (C, 2)), 3);
async_payload_tuple!(((A, 0), (B, 1), (C, 2), (D, 3)), 4);
async_payload_tuple!(((A, 0), (B, 1), (C, 2), (D, 3), (E, 4)), 5);
async_payload_tuple!(((A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5)), 6);
async_payload_tuple!(((A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6)), 7);
async_payload_tuple!(((A, 0), (B, 1), (C, 2), (D, 3), (E, 4), (F, 5), (G, 6), (H, 7)), 8);