bserde 0.1.21

Library for serializing data to binary.
Documentation
use crate::deserializer::BDeserialize;
use std::io::Error;

macro_rules! deserialize_ty {
  ($($t:ty),* $(,)?) => {
    $(
      impl BDeserialize for $t {
        type Error = Error;
        fn deserialize(input: &mut &[u8]) -> Result<Self, Self::Error> {
          let bytes = read(input, size_of::<$t>())?;
          let arr: [u8; size_of::<$t>()] = bytes.try_into().unwrap();
          Ok(<$t>::from_le_bytes(arr))
        }
      }
    )*
  };
}

fn read<'a>(input: &mut &'a [u8], n: usize) -> Result<&'a [u8], Error> {
  if input.len() < n {
    return Err(Error::new(
      std::io::ErrorKind::InvalidData,
      "Unexpected EOF",
    ));
  }

  let (head, tail) = input.split_at(n);
  *input = tail;

  Ok(head)
}

deserialize_ty!(u8);
deserialize_ty!(u16);
deserialize_ty!(u32);
deserialize_ty!(u64);
deserialize_ty!(u128);

deserialize_ty!(i8);
deserialize_ty!(i16);
deserialize_ty!(i32);
deserialize_ty!(i64);
deserialize_ty!(i128);

impl BDeserialize for String {
  type Error = Error;
  fn deserialize(input: &mut &[u8]) -> Result<Self, Self::Error> {
    let len = u16::deserialize(input)?;
    let bytes = read(input, len as usize)?;
    Ok(String::from_utf8(bytes.to_vec()).unwrap())
  }
}