use alloc::vec::Vec;
use crate::error::Result;
pub struct StreamingReader<'a> {
data: &'a [u8],
position: usize,
}
impl<'a> StreamingReader<'a> {
pub fn new(data: &'a [u8]) -> Self {
Self { data, position: 0 }
}
pub fn read_exact(&mut self, len: usize) -> Result<&'a [u8]> {
if self.position + len > self.data.len() {
return Err(crate::Error::invalid_format("unexpected EOF"));
}
let result = &self.data[self.position..self.position + len];
self.position += len;
Ok(result)
}
pub fn read_u32_le(&mut self) -> Result<u32> {
let bytes = self.read_exact(4)?;
Ok(u32::from_le_bytes([bytes[0], bytes[1], bytes[2], bytes[3]]))
}
pub fn read_u64_le(&mut self) -> Result<u64> {
let bytes = self.read_exact(8)?;
Ok(u64::from_le_bytes([
bytes[0], bytes[1], bytes[2], bytes[3],
bytes[4], bytes[5], bytes[6], bytes[7],
]))
}
pub fn remaining(&self) -> usize {
self.data.len() - self.position
}
pub fn is_empty(&self) -> bool {
self.position >= self.data.len()
}
}