1pub struct Reader<'a> {
2 pub buffer: &'a [u8],
3 pub bytes_consumed: usize,
4}
5
6impl<'a> Reader<'a> {
7 pub fn read(&mut self, length: usize) -> Result<&'a [u8], &'static str> {
8 let subslice = self.buffer.get(..length).ok_or("unexpected end of section")?;
9 self.buffer = &self.buffer[length..];
10 self.bytes_consumed += length;
11 Ok(subslice)
12 }
13
14 pub fn read_byte(&mut self) -> Result<u8, &'static str> {
15 Ok(self.read(1)?[0])
16 }
17
18 pub fn read_u32(&mut self) -> Result<u32, &'static str> {
19 let v = self.read(4)?;
20 Ok(u32::from_le_bytes([v[0], v[1], v[2], v[3]]))
21 }
22
23 pub fn offset(&self) -> usize {
24 self.bytes_consumed
25 }
26
27 pub fn is_empty(&self) -> bool {
28 self.bytes_consumed >= self.buffer.len()
29 }
30}
31
32impl<'a> From<&'a [u8]> for Reader<'a> {
33 fn from(buffer: &'a [u8]) -> Self {
34 Reader { buffer, bytes_consumed: 0 }
35 }
36}