mod array;
mod boolean;
mod integer;
mod strarray;
mod unit;
pub use crate::coding::{strarray::StrArray, unit::Unit};
use crate::error::Error;
pub trait RawcodeConstSize {
const SIZE: usize;
fn size() -> usize {
Self::SIZE
}
}
pub trait RawcodeEncode
where
Self: RawcodeConstSize,
{
fn encode(&self, buf: &mut [u8]) -> Result<(), Error>;
}
pub trait RawcodeDecode
where
Self: RawcodeConstSize + Sized,
{
fn decode(buf: &[u8]) -> Result<Self, Error>;
}
pub fn to_slice<T>(value: &T, buf: &mut [u8]) -> Result<(), Error>
where
T: RawcodeEncode,
{
value.encode(buf)
}
pub fn to_slice_at<T>(value: &T, buf: &mut [u8], pos: &mut usize) -> Result<(), Error>
where
T: RawcodeEncode,
{
let buf = buf.get_mut(*pos..).and_then(|buf| buf.get_mut(..T::SIZE)).ok_or(e!("Truncated buffer"))?;
value.encode(buf)?;
*pos += T::SIZE;
Ok(())
}
#[cfg(feature = "std")]
pub fn to_vec<T>(value: &T) -> Result<Vec<u8>, Error>
where
T: RawcodeEncode,
{
let mut buf = vec![0; T::SIZE];
value.encode(&mut buf)?;
Ok(buf)
}
pub fn from_slice<T>(buf: &[u8]) -> Result<T, Error>
where
T: RawcodeDecode,
{
T::decode(buf)
}
pub fn from_slice_at<T>(buf: &[u8], pos: &mut usize) -> Result<T, Error>
where
T: RawcodeDecode,
{
let buf = buf.get(*pos..).and_then(|buf| buf.get(..T::SIZE)).ok_or(e!("Truncated data"))?;
let value = T::decode(buf)?;
*pos += T::SIZE;
Ok(value)
}