serde_jam/io/
reader.rs

1//! Reader for binary formats
2
3use crate::{Cow, compact::vlen};
4
5/// Reader for binary formats
6pub trait Reader {
7    /// Read a variable length integer
8    fn read_var(&mut self) -> Option<u32>;
9
10    /// Read a 32-bit integer
11    fn read_u32(&mut self) -> Option<u32>;
12
13    /// Read a 24-bit integer
14    fn read_u24(&mut self) -> Option<u32>;
15
16    /// Read a 16-bit integer
17    fn read_u16(&mut self) -> Option<u16>;
18
19    /// Read a 8-bit integer
20    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
71/// Read a borrowed slice of bytes from the reader.
72pub 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}