use nom::IResult;
use nom::Parser;
use nom::combinator::map;
use nom::number::streaming::le_u32;
use super::compression_type::CompressionType;
use super::compression_type::compression_parser;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct BlockHeader {
pub(super) compression_type: CompressionType,
pub(super) uncompressed_size: u32,
pub(super) compressed_size: Option<u32>,
}
pub(super) fn block_header_parser(input: &[u8]) -> IResult<&[u8], BlockHeader> {
let (remain, compression_type) = compression_parser(input)?;
if compression_type == CompressionType::None {
map(le_u32, |uncompressed_size| {
BlockHeader {
compression_type: CompressionType::None,
uncompressed_size,
compressed_size: None,
}
})
.parse(remain)
} else {
map((le_u32, le_u32), |(uncompressed_size, compressed_size)| {
BlockHeader {
compression_type: compression_type.clone(),
uncompressed_size,
compressed_size: Some(compressed_size),
}
})
.parse(remain)
}
}
impl BlockHeader {
pub(super) const fn size_in_bytes(&self) -> usize {
match self.compression_type {
CompressionType::None => 8,
_ => 12,
}
}
pub(super) const fn payload_size_in_bytes(&self) -> usize {
match self.compressed_size {
Some(size) => size as usize,
None => self.uncompressed_size as usize,
}
}
}