zusi-protocol 0.2.1

Contains serialization and deserialization logic for the Zusi 3 TCP-Protocol
Documentation
use crate::{Deserialize, ProtocolError, Result};
use core::mem;
use std::io::Read;

macro_rules! impl_deserialize_for_num {
    ($type:ty) => {
        impl Deserialize for $type {
            fn deserialize<R>(reader: &mut R, length: u32) -> Result<Self>
            where
                R: Read,
            {
                const SIZE: usize = mem::size_of::<$type>();

                if SIZE != length as usize {
                    return Err(ProtocolError::Deserialization(format!(
                        "memory size ({}) of type {} differs from reported length {}",
                        SIZE,
                        stringify!($type),
                        length
                    )));
                }

                let mut bts: [u8; SIZE] = [0; SIZE];
                reader.read_exact(&mut bts)?;
                let result = Self::from_le_bytes(bts);

                Ok(result)
            }
        }
    };
}

impl_deserialize_for_num!(u8);
impl_deserialize_for_num!(i8);
impl_deserialize_for_num!(u16);
impl_deserialize_for_num!(i16);
impl_deserialize_for_num!(u32);
impl_deserialize_for_num!(i32);
impl_deserialize_for_num!(u64);
impl_deserialize_for_num!(i64);
impl_deserialize_for_num!(f32);
impl_deserialize_for_num!(f64);

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

    #[test]
    fn deserialize_u8() {
        let bts: Vec<u8> = vec![0x05];

        let result: u8 = u8::deserialize(&mut &bts[..], 1).unwrap();

        assert_eq!(result, 5)
    }

    #[test]
    fn deserialize_u8_wrong_length() {
        let bts: Vec<u8> = vec![0x05];

        let _result = u8::deserialize(&mut &bts[..], 2)
            .expect_err("memory size (1) of type u8 differs from reported length 2");
    }
}