#![cfg_attr(docsrs, feature(doc_cfg))]
#![warn(missing_docs)]
#![warn(clippy::all)]
#![no_std]
#[cfg(feature = "std")]
extern crate std;
mod builder;
mod errors;
mod primitives;
mod reader;
mod vector;
pub use builder::{MessageBuilder, VectorBuilder};
pub use errors::{Error, Result};
pub use primitives::{Endian, PrimitiveType};
pub use reader::{MessageReader, VectorReader};
pub use vector::Vector;
pub mod prelude {
pub use crate::{
builder::{MessageBuilder, VectorBuilder},
errors::{Error, Result},
primitives::{Endian, PrimitiveType},
reader::{MessageReader, VectorReader},
vector::Vector,
};
}
pub mod constants {
use crate::primitives::Endian;
pub const MAX_FIELDS: u16 = u16::MAX;
pub const FIELD_ENTRY_SIZE: usize = 5;
pub const ENDIANNESS: Endian = Endian::Little;
}
pub use constants::ENDIANNESS;
pub trait ZpRead<'a>: Sized {
fn read(buf: &'a [u8], offset: usize) -> Result<Self>;
fn size() -> usize;
}
pub trait ZpWrite: Sized {
fn write(&self, buf: &mut [u8], offset: usize) -> Result<()>;
fn size(&self) -> usize;
}
macro_rules! impl_primitive_read {
($ty:ty, $size:expr, $read_method:ident) => {
impl<'a> ZpRead<'a> for $ty {
fn read(buf: &'a [u8], offset: usize) -> Result<Self> {
if offset + $size > buf.len() {
return Err(Error::OutOfBounds);
}
Ok(ENDIANNESS.$read_method(buf, offset))
}
fn size() -> usize {
$size
}
}
};
}
macro_rules! impl_primitive_write {
($ty:ty, $size:expr, $write_method:ident) => {
impl ZpWrite for $ty {
fn write(&self, buf: &mut [u8], offset: usize) -> Result<()> {
if offset + $size > buf.len() {
return Err(Error::OutOfBounds);
}
ENDIANNESS.$write_method(*self, buf, offset);
Ok(())
}
fn size(&self) -> usize {
$size
}
}
};
}
impl_primitive_read!(u8, 1, read_u8);
impl_primitive_read!(u16, 2, read_u16);
impl_primitive_read!(u32, 4, read_u32);
impl_primitive_read!(u64, 8, read_u64);
impl_primitive_read!(i8, 1, read_i8);
impl_primitive_read!(i16, 2, read_i16);
impl_primitive_read!(i32, 4, read_i32);
impl_primitive_read!(i64, 8, read_i64);
impl_primitive_read!(f32, 4, read_f32);
impl_primitive_read!(f64, 8, read_f64);
impl_primitive_read!(bool, 1, read_bool);
impl_primitive_write!(u8, 1, write_u8);
impl_primitive_write!(u16, 2, write_u16);
impl_primitive_write!(u32, 4, write_u32);
impl_primitive_write!(u64, 8, write_u64);
impl_primitive_write!(i8, 1, write_i8);
impl_primitive_write!(i16, 2, write_i16);
impl_primitive_write!(i32, 4, write_i32);
impl_primitive_write!(i64, 8, write_i64);
impl_primitive_write!(f32, 4, write_f32);
impl_primitive_write!(f64, 8, write_f64);
impl_primitive_write!(bool, 1, write_bool);