use anyhow::Result;
use crate::models::{
common::{BasicHeaderSegment, Builder},
opcode::BhsOpcode,
};
pub trait ToBytes: Sized {
type Header: AsRef<[u8]>;
type Body: AsRef<[u8]>;
fn to_bytes(
&mut self,
max_recv_data_segment_length: usize,
) -> Result<(Self::Header, Self::Body)>;
}
pub trait FromBytes: Sized + BasicHeaderSegment {
fn from_bhs_bytes(bytes: &mut [u8]) -> Result<&mut Self> {
let _ = BhsOpcode::try_from(bytes[0])
.map_err(|e| anyhow::anyhow!("invalid opcode: {}", e))?;
Self::from_bhs_bytes(bytes)
}
}
impl<B> ToBytes for B
where B: Builder
{
type Body = B::Body;
type Header = B::Header;
fn to_bytes(
&mut self,
max_recv_data_segment_length: usize,
) -> Result<(Self::Header, Self::Body)> {
self.build(max_recv_data_segment_length)
}
}