use anyhow::{Result, bail};
use crate::{
cfg::config::Config,
models::{
common::{BasicHeaderSegment, Builder},
parse::Pdu,
},
};
pub trait ToBytes: Sized {
type Header: AsRef<[u8]>;
fn to_bytes(self, cfg: &Config) -> Result<(Self::Header, Vec<u8>)>;
}
pub trait FromBytes: Sized + BasicHeaderSegment {
const HEADER_LEN: usize;
fn total_len(buf: &[u8]) -> Result<usize> {
if buf.len() < Self::HEADER_LEN {
bail!(
"Buffer {} too small for Pdu BHS {}",
buf.len(),
Self::HEADER_LEN
);
}
let hdr = Pdu::from_bhs_bytes(&buf[..Self::HEADER_LEN])?;
Ok(hdr.total_length_bytes())
}
fn from_bytes(buf: &[u8]) -> Result<Self>;
}
impl<B> ToBytes for B
where B: Builder
{
type Header = B::Header;
fn to_bytes(self, cfg: &Config) -> Result<(Self::Header, Vec<u8>)> {
self.build(cfg)
}
}