mycraft/packet/
reader.rs

1use std::vec::IntoIter;
2
3#[derive(Debug, Clone, Copy)]
4pub enum McBytesErr {
5    VarintTooBig,
6    InsufficientBytes,
7}
8
9/// Minecraft bytes
10#[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