1use crate::{Cow, compact::vlen};
4
5pub trait Reader {
7 fn read_var(&mut self) -> Option<u32>;
9
10 fn read_u32(&mut self) -> Option<u32>;
12
13 fn read_u24(&mut self) -> Option<u32>;
15
16 fn read_u16(&mut self) -> Option<u16>;
18
19 fn read_u8(&mut self) -> Option<u8>;
21}
22
23impl Reader for &[u8] {
24 fn read_var(&mut self) -> Option<u32> {
25 let (value, length) = vlen::decode_from(self);
26 *self = &self[length..];
27 Some(value as u32)
28 }
29
30 fn read_u32(&mut self) -> Option<u32> {
31 if self.len() < 4 {
32 return None;
33 }
34
35 let value = u32::from_le_bytes([self[0], self[1], self[2], self[3]]);
36 *self = &self[4..];
37 Some(value)
38 }
39
40 fn read_u24(&mut self) -> Option<u32> {
41 if self.len() < 3 {
42 return None;
43 }
44
45 let value = u32::from_le_bytes([self[0], self[1], self[2], 0]);
46 *self = &self[3..];
47 Some(value)
48 }
49
50 fn read_u16(&mut self) -> Option<u16> {
51 if self.len() < 2 {
52 return None;
53 }
54
55 let value = u16::from_le_bytes([self[0], self[1]]);
56 *self = &self[2..];
57 Some(value)
58 }
59
60 fn read_u8(&mut self) -> Option<u8> {
61 if self.is_empty() {
62 return None;
63 }
64
65 let value = self[0];
66 *self = &self[1..];
67 Some(value)
68 }
69}
70
71pub fn read<'a>(bytes: &mut &'a [u8], length: u32) -> Option<Cow<'a, [u8]>> {
73 let length = length as usize;
74 let slice = bytes.get(..length)?;
75 *bytes = &bytes[length..];
76 Some(Cow::Borrowed(slice))
77}