rust_mqtt/utils/
buffer_reader.rs1use core::mem;
26use core::str;
27
28use crate::encoding::variable_byte_integer::VariableByteIntegerDecoder;
29use crate::utils::types::{BinaryData, BufferError, EncodedString, StringPair};
30
31pub struct BuffReader<'a> {
35 buffer: &'a [u8],
36 pub position: usize,
37 len: usize,
38}
39
40impl<'a> BuffReader<'a> {
41 pub fn increment_position(&mut self, increment: usize) {
42 self.position += increment;
43 }
44
45 pub fn new(buffer: &'a [u8], buff_len: usize) -> Self {
46 Self {
47 buffer,
48 position: 0,
49 len: buff_len,
50 }
51 }
52
53 pub fn read_variable_byte_int(&mut self) -> Result<u32, BufferError> {
56 let mut variable_byte_integer: [u8; 4] = [0; 4];
57 let mut len: usize = 1;
58
59 let mut x = 0;
61 loop {
62 if x >= 4 {
63 break;
64 }
65 if self.position + x >= self.len {
66 return Err(BufferError::InsufficientBufferSize);
67 }
68 if self.buffer[self.position + x] & 0x80 != 0 {
69 variable_byte_integer[x] = self.buffer[self.position + x];
70 len += 1
71 } else {
72 variable_byte_integer[x] = self.buffer[self.position + x];
73 x += 1;
74 if x != 4 {
75 loop {
76 variable_byte_integer[x] = 0;
77 x += 1;
78 if x == 4 {
79 break;
80 }
81 }
82 break;
83 }
84 }
85 x += 1;
86 }
87 self.increment_position(len);
88 VariableByteIntegerDecoder::decode(variable_byte_integer)
89 }
90
91 pub fn read_u32(&mut self) -> Result<u32, BufferError> {
93 if self.position + 4 > self.len {
94 return Err(BufferError::InsufficientBufferSize);
95 }
96 let (int_bytes, _rest) = self.buffer[self.position..].split_at(mem::size_of::<u32>());
97 let ret: u32 = u32::from_be_bytes(int_bytes.try_into().unwrap());
98 self.increment_position(4);
99 Ok(ret)
100 }
101
102 pub fn read_u16(&mut self) -> Result<u16, BufferError> {
104 if self.position + 2 > self.len {
105 return Err(BufferError::InsufficientBufferSize);
106 }
107 let (int_bytes, _rest) = self.buffer[self.position..].split_at(mem::size_of::<u16>());
108 let ret: u16 = u16::from_be_bytes(int_bytes.try_into().unwrap());
109 self.increment_position(2);
110 Ok(ret)
111 }
112
113 pub fn read_u8(&mut self) -> Result<u8, BufferError> {
115 if self.position >= self.len {
116 return Err(BufferError::InsufficientBufferSize);
117 }
118 let ret: u8 = self.buffer[self.position];
119 self.increment_position(1);
120 Ok(ret)
121 }
122
123 pub fn read_string(&mut self) -> Result<EncodedString<'a>, BufferError> {
125 let len = self.read_u16()? as usize;
126
127 if self.position + len > self.len {
128 self.position -= 2;
129 return Err(BufferError::InsufficientBufferSize);
130 }
131
132 let res_str = str::from_utf8(&(self.buffer[self.position..(self.position + len)]));
133 if res_str.is_err() {
134 self.position -= 2;
135 error!("Could not parse utf-8 string");
136 return Err(BufferError::Utf8Error);
137 }
138 self.increment_position(len);
139 Ok(EncodedString {
140 string: res_str.unwrap(),
141 len: len as u16,
142 })
143 }
144
145 pub fn read_binary(&mut self) -> Result<BinaryData<'a>, BufferError> {
147 let len = self.read_u16()?;
148
149 if self.position + len as usize > self.len {
150 self.position -= 2;
151 return Err(BufferError::InsufficientBufferSize);
152 }
153
154 let res_bin = &(self.buffer[self.position..(self.position + len as usize)]);
155 self.increment_position(len.into());
156 Ok(BinaryData { bin: res_bin, len })
157 }
158
159 pub fn read_string_pair(&mut self) -> Result<StringPair<'a>, BufferError> {
161 let starting_position = self.position;
162 let name = self.read_string()?;
163 let len_name = self.position - starting_position;
164
165 match self.read_string() {
166 Ok(value) => Ok(StringPair { name, value }),
167 Err(e) => {
168 self.position -= len_name;
169 Err(e)
170 },
171 }
172 }
173
174 pub fn read_message(&mut self, total_len: usize) -> &'a [u8] {
176 if total_len > self.len {
177 return &self.buffer[self.position..self.len];
178 }
179 &self.buffer[self.position..total_len]
180 }
181
182 pub fn peek_u8(&self) -> Result<u8, BufferError> {
184 if self.position >= self.len {
185 return Err(BufferError::InsufficientBufferSize);
186 }
187 Ok(self.buffer[self.position])
188 }
189}