mod read;
mod sreader;
use crate::*;
pub use sreader::*;
pub struct PayloadHeader {
pub sig: ByteBlock,
pub crc: ByteBlock,
pub len: u32,
}
impl PayloadHeader {
pub fn new<T: PayloadSignature + PayloadSize + PayloadCrc>(
src: &T,
ctx: &mut T::Context<'_>,
) -> std::io::Result<Self> {
let len = src.size(ctx)?;
if len > u32::MAX as u64 {
return Err(std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!("Size of payload cannot be bigger {} bytes", u32::MAX),
));
}
Ok(Self {
sig: src.sig(),
crc: src.crc(ctx)?,
len: len as u32,
})
}
pub fn payload_len(&self) -> usize {
self.len as usize
}
pub fn size(&self) -> usize {
1 + self.sig.size() + 1 + self.crc.size() + std::mem::size_of::<u32>()
}
pub fn ssize<T: PayloadSignature + PayloadSize + PayloadCrc>(
src: &T,
) -> std::io::Result<usize> {
Ok(1 + src.sig().size() + 1 + T::crc_size() + std::mem::size_of::<u32>())
}
pub fn as_vec(&self) -> Vec<u8> {
let sig = self.sig.as_slice();
let crc = self.crc.as_slice();
let mut buffer = Vec::new();
buffer.push(sig.len() as u8);
buffer.extend_from_slice(sig);
buffer.push(crc.len() as u8);
buffer.extend_from_slice(crc);
buffer.extend_from_slice(&self.len.to_le_bytes());
buffer
}
}