1use std::vec::IntoIter;
2
3#[derive(Debug, Clone, Copy)]
4pub enum McBytesErr {
5 VarintTooBig,
6 InsufficientBytes,
7}
8
9#[derive(Debug)]
11pub struct McBytesReader {
12 iter: IntoIter<u8>,
13}
14
15impl McBytesReader {
16 pub fn from_vec(data: Vec<u8>) -> Self {
17 Self {
18 iter: data.into_iter(),
19 }
20 }
21
22 pub fn read_varint(&mut self) -> Result<i32, McBytesErr> {
23 let mut num_read: i32 = 0;
24 let mut result: i32 = 0;
25 let mut buf: u8;
26 loop {
27 buf = self.iter.next().unwrap();
28 let value = buf & 0b01111111;
29 result |= (value as i32) << (7 * num_read);
30 num_read += 1;
31 if num_read > 5 {
32 return Err(McBytesErr::VarintTooBig);
33 }
34 if (buf & 0b10000000) == 0 {
35 break;
36 }
37 }
38 Ok(result)
39 }
40
41 pub fn read_unsigned_short(&mut self) -> Result<u16, McBytesErr> {
42 let result: u16 = self.read_one_byte()? as u16 + ((self.read_one_byte()? as u16) << 8);
43 Ok(result)
44 }
45
46 pub fn read_string(&mut self) -> Result<String, McBytesErr> {
47 let length = self.read_varint()?;
48 let result = self.read_bytes(length)?;
49 Ok(String::from_utf8_lossy(result.as_slice()).into_owned())
50 }
51
52 pub fn read_one_byte(&mut self) -> Result<u8, McBytesErr> {
53 self.iter.next().ok_or(McBytesErr::InsufficientBytes)
54 }
55
56 pub fn read_bytes(&mut self, n: i32) -> Result<Vec<u8>, McBytesErr> {
57 let mut result = Vec::new();
58 for _ in 0..n {
59 result.push(self.read_one_byte()?);
60 }
61 Ok(result)
62 }
63}
64