netstack/serialization/
reader.rs1use 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}