use anyhow::Result;
use crate::{
cfg::config::Config,
models::{
common::{BasicHeaderSegment, Builder},
opcode::BhsOpcode,
},
};
pub trait ToBytes: Sized {
type Header: AsRef<[u8]>;
fn to_bytes(&mut self, cfg: &Config) -> Result<Vec<(Self::Header, Vec<u8>)>>;
}
pub trait FromBytes: Sized + BasicHeaderSegment {
fn from_bhs_bytes(bytes: &[u8]) -> Result<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, cfg: &Config) -> Result<Vec<(Self::Header, Vec<u8>)>> {
self.build(cfg)
}
}