netstack/serialization/
reader.rs

1use super::{Deserializer, SerializationError};
2use super::zig_zag::decode;
3
4const VARINT_MAX_ITERATIONS: usize = 10;
5
6pub struct Reader<'a> {
7    buffer: &'a [u8],
8    position: usize,
9}
10
11impl<'a> Reader<'a> {
12    pub fn new(buffer: &'a [u8]) -> Self {
13        Self {
14            buffer,
15            position: 0,
16        }
17    }
18
19    fn read_var_uint(&mut self) -> Result<u64, SerializationError> {
20        let start = self.position;
21        let mut bytes_read = 0;
22
23        let mut decoded = 0;
24        let mut shift = 0;
25
26        for i in 0..VARINT_MAX_ITERATIONS {
27            let value = self.buffer[start + i];
28            bytes_read += 1;
29
30            decoded |= ((value & 0x7f) as u64) << shift;
31
32            if (value & 0x80) != 0x80 {
33                self.position += bytes_read;
34                return Ok(decoded);
35            }
36
37            shift += 7;
38        }
39
40        Err(SerializationError::VarUIntOverflow)
41    }
42
43    fn read_var_int(&mut self) -> Result<i64, SerializationError> {
44        let value = self.read_var_uint()?;
45        Ok(decode(value))
46    }
47}
48
49impl<'a> Deserializer for Reader<'a> {
50    fn deserialize_string(&mut self) -> Result<String, SerializationError> {
51        let length = self.read_var_uint()? as usize;
52        let start = self.position;
53        let end = self.position + length;
54
55        self.position += length;
56
57        Ok(std::str::from_utf8(&self.buffer[start..end]).unwrap().to_owned())
58    }
59
60    fn deserialize_u8(&mut self) -> Result<u8, SerializationError> {
61        let position = self.position;
62        self.position += 1;
63        Ok(self.buffer[position])
64    }
65
66    fn deserialize_i8(&mut self) -> Result<i8, SerializationError> {
67        let position = self.position;
68        self.position += 1;
69
70        Ok(self.buffer[position] as i8)
71    }
72    
73    fn deserialize_u16(&mut self) -> Result<u16, SerializationError> { unimplemented!() }
74    fn deserialize_i16(&mut self) -> Result<i16, SerializationError> { unimplemented!() }
75    fn deserialize_u32(&mut self) -> Result<u32, SerializationError> { unimplemented!() }
76    fn deserialize_i32(&mut self) -> Result<i32, SerializationError> { unimplemented!() }
77    fn deserialize_u64(&mut self) -> Result<u64, SerializationError> { unimplemented!() }
78    fn deserialize_i64(&mut self) -> Result<i64, SerializationError> { unimplemented!() }
79    fn deserialize_f32(&mut self) -> Result<f32, SerializationError> { unimplemented!() }
80    fn deserialize_f64(&mut self) -> Result<f64, SerializationError> { unimplemented!() }
81}