use anyhow::Result;
use crate::models::{
common::{BasicHeaderSegment, Builder},
opcode::BhsOpcode,
};
pub trait ToBytes: Sized {
type Header: AsRef<[u8]>;
fn to_bytes(
&mut self,
max_recv_data_segment_length: usize,
enable_header_digest: bool,
enable_data_digest: bool,
) -> Result<(Self::Header, Vec<u8>)>;
}
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 Header = B::Header;
fn to_bytes(
&mut self,
max_recv_data_segment_length: usize,
enable_header_digest: bool,
enable_data_digest: bool,
) -> Result<(Self::Header, Vec<u8>)> {
self.build(
max_recv_data_segment_length,
enable_header_digest,
enable_data_digest,
)
}
}