use thiserror::Error;
mod impls;
mod macros;
pub use sirius_macros::Sirius;
pub type LengthPrefix = u32;
const LENGTH_BYTES: usize = std::mem::size_of::<LengthPrefix>();
pub trait Sirius {
fn serialize(&self, output: &mut impl std::io::Write) -> Result<usize, SiriusError>;
fn deserialize(data: &[u8]) -> Result<(Self, usize), SiriusError>
where
Self: Sized;
fn serialize_buffered(&self) -> Vec<u8> {
let mut data = vec![];
_ = Sirius::serialize(self, &mut data);
data
}
}
#[derive(Debug, Error)]
pub enum SiriusError {
#[error("ran out of data bytes while parsing, cannot deserialize the remaining fields")]
NotEnoughData,
#[error("failed to parse data as `{ty_name}`: {error}")]
ParsingError {
ty_name: &'static str,
error: String,
},
#[error("I/O error: {0}")]
IoError(#[from] std::io::Error),
}