use super::ByteWriter;
#[cfg(feature = "stream")]
use super::{LoadError, read_u32_at};
pub(crate) const TAG_PFIX: [u8; 4] = *b"PFIX";
pub(crate) const PFIX_DESC_LEN: usize = 12;
#[cfg(feature = "stream")]
pub(crate) struct PfixDesc {
pub(crate) desc_len: usize,
pub(crate) record_stride: usize,
}
#[cfg(feature = "stream")]
pub(crate) fn parse_pfix_chunk(chunk: &[u8]) -> Result<PfixDesc, LoadError> {
if chunk.len() < PFIX_DESC_LEN {
return Err(LoadError::Truncated);
}
let desc_len = read_u32_at(chunk, 0)? as usize;
if desc_len < PFIX_DESC_LEN {
return Err(LoadError::InvalidTree);
}
let ordering = chunk[4];
let compression = chunk[5];
if ordering != 0 || compression != 0 {
return Err(LoadError::UnsupportedVersion);
}
let record_stride = read_u32_at(chunk, 8)? as usize;
if record_stride == 0 {
return Err(LoadError::InvalidTree);
}
Ok(PfixDesc {
desc_len,
record_stride,
})
}
impl ByteWriter<'_> {
pub(crate) fn write_pfix_desc(&mut self, record_stride: u32) {
self.write_u32(PFIX_DESC_LEN as u32);
self.write_u8(0); self.write_u8(0); self.write_u16(0); self.write_u32(record_stride);
}
}