use binrw::{
BinRead, BinWrite,
meta::{ReadEndian, WriteEndian},
};
pub trait Packet:
for<'r> BinRead<Args<'r> = ()> + ReadEndian + for<'w> BinWrite<Args<'w> = ()> + WriteEndian
{
fn from_bytes(bytes: impl AsRef<[u8]>) -> Result<Self, Error> {
Self::read(&mut std::io::Cursor::new(bytes.as_ref())).map_err(Error)
}
fn to_bytes(&self) -> Vec<u8> {
let mut buf = std::io::Cursor::new(Vec::new());
self.write(&mut buf).unwrap_or_else(|err| {
panic!(
"failed to serialize `{}`: {err}",
std::any::type_name::<Self>()
)
});
buf.into_inner()
}
}
#[derive(Debug)]
pub struct Error(binrw::Error);
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl std::error::Error for Error {}