npsd 0.2.0

Network payload serializer / deserializer framework
Documentation
use super::{Error, FromPayload, IntoPayload, Middleware, Payload};

impl<'a, C, T: IntoPayload<C>> IntoPayload<C> for Option<T> {
    fn into_payload<'b, M: Middleware<'b>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
        if let Some(data) = self {
            next.into_payload(&1u8, ctx)?;
            next.into_payload(data, ctx)
        } else {
            next.into_payload(&0u8, ctx)
        }
    }
}

impl<'a, C, T: FromPayload<'a, C>> FromPayload<'a, C> for Option<T> {
    fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
        let byte: u8 = next.from_payload(ctx)?;

        if byte != 0 {
            let res: T = next.from_payload(ctx)?;

            Ok(Some(res))
        } else {
            Ok(None)
        }
    }
}

impl<'a, C, T: Payload<'a, C>> Payload<'a, C> for Option<T> {}

impl<'a, C, T: IntoPayload<C>, E: IntoPayload<C>> IntoPayload<C> for Result<T, E> {
    fn into_payload<'b, M: Middleware<'b>>(&self, ctx: &mut C, next: &mut M) -> Result<(), Error> {
        match self {
            Ok(res) => {
                next.into_payload(&1u8, ctx)?;
                next.into_payload(res, ctx)
            },
            Err(error) => {
                next.into_payload(&0u8, ctx)?;
                next.into_payload(error, ctx)
            }
        }
    }
}

impl<'a, C, T: FromPayload<'a, C>, E: FromPayload<'a, C>> FromPayload<'a, C> for Result<T, E> {
    fn from_payload<M: Middleware<'a>>(ctx: &mut C, next: &mut M) -> Result<Self, Error> {
        let byte: u8 = next.from_payload(ctx)?;

        if byte != 0 {
            let res: T = next.from_payload(ctx)?;

            Ok(Ok(res))
        } else {
            let res: E = next.from_payload(ctx)?;

            Ok(Err(res))
        }
    }
}

impl<'a, C, T: Payload<'a, C>, E: Payload<'a, C>> Payload<'a, C> for Result<T, E> {}