#[derive(Copy, Clone, PartialEq, Eq)]
pub enum ChunkType {
Init = 0,
#[allow(dead_code)]
Cont = 0x80,
}
pub struct ChunkHeader {
channel_id: u8,
chunk_type: ChunkType,
more_data: bool,
as_bytes: [u8; 1],
}
impl ChunkHeader {
const CHUNK_CHANNEL: u8 = 0;
const CHUNK_CHANNEL_MASK: u8 = 0x7;
const CHUNK_MORE_DATA_BIT: u8 = 0x40;
const CHUNK_CRC_DEFERRED_BIT: u8 = 0x08;
pub fn new_single() -> Self {
let mut header = Self {
channel_id: Self::CHUNK_CHANNEL,
chunk_type: ChunkType::Init,
more_data: false,
as_bytes: [0],
};
header.calculate_header_bytes();
header
}
fn calculate_header_bytes(&mut self) {
let byte = &mut self.as_bytes[0];
*byte = 0;
*byte |= self.channel_id & Self::CHUNK_CHANNEL_MASK;
if self.more_data {
*byte |= Self::CHUNK_MORE_DATA_BIT;
}
*byte |= self.chunk_type as u8;
*byte |= Self::CHUNK_CRC_DEFERRED_BIT;
}
pub fn as_bytes(&self) -> &[u8] {
&self.as_bytes
}
}