encode 1.0.0

A simple framework for encoding binary data.
Documentation
use crate::BaseEncoder;
use crate::Encodable;

impl<T, E> Encodable<E> for Option<T>
where
    T: Encodable<E>,
    E: BaseEncoder,
{
    type Error = T::Error;

    #[inline]
    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
        match self {
            Some(value) => value.encode(encoder),
            None => Ok(()),
        }
    }
}

impl<T, E> Encodable<E> for Result<T, T::Error>
where
    T: Encodable<E>,
    E: BaseEncoder,
    T::Error: Clone,
{
    type Error = T::Error;

    #[inline]
    fn encode(&self, encoder: &mut E) -> Result<(), Self::Error> {
        match self {
            Ok(value) => value.encode(encoder),
            Err(err) => Err(err.clone()),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::encoders::InsufficientSpace;

    const BUF_SIZE: usize = 64;

    #[test]
    fn assert_that_some_option_can_be_encoded() {
        let expected = b"\x01";
        let encodable = Some(1u8);

        let mut buf = [0u8; BUF_SIZE];
        let mut encoder = &mut buf as &mut [u8];
        encodable.encode(&mut encoder).unwrap();
        let written = BUF_SIZE - encoder.len();
        let result = &buf[..written];

        assert_eq!(expected, result);
    }

    #[test]
    fn assert_that_none_encodes_nothing() {
        let expected = b"";
        let encodable = None::<u8>;

        let mut buf = [0u8; BUF_SIZE];
        let mut encoder = &mut buf as &mut [u8];
        encodable.encode(&mut encoder).unwrap();
        let written = BUF_SIZE - encoder.len();
        let result = &buf[..written];

        assert_eq!(expected, result);
    }

    #[test]
    fn assert_that_ok_result_can_be_encoded() {
        let expected = b"\x01";
        let encodable = Ok(1u8);

        let mut buf = [0u8; BUF_SIZE];
        let mut encoder = &mut buf as &mut [u8];
        encodable.encode(&mut encoder).unwrap();
        let written = BUF_SIZE - encoder.len();
        let result = &buf[..written];

        assert_eq!(expected, result);
    }

    #[test]
    fn assert_that_err_result_returns_the_error() {
        let encodable = Err::<u8, _>(InsufficientSpace);

        let mut buf = [0u8; BUF_SIZE];
        let mut encoder = &mut buf as &mut [u8];
        encodable.encode(&mut encoder).unwrap_err();
    }
}