swarm_bot_packets/
read.rs

1use std::io::{Cursor, Read};
2
3use bytes::Buf;
4
5use crate::types::{BitField, VarUInt};
6
7#[derive(Clone)]
8pub struct ByteReader {
9    bytes: Cursor<Vec<u8>>,
10}
11
12pub struct LenRead<T> {
13    pub value: T,
14    pub len: usize,
15}
16
17impl ByteReader {
18    pub fn read<T: ByteReadable>(&mut self) -> T {
19        T::read_from_bytes(self)
20    }
21
22    pub fn back(&mut self, bytes: u64) {
23        let position = self.bytes.position();
24        let new_position = position - bytes;
25        self.bytes.set_position(new_position);
26    }
27
28    pub fn read_with_len<T: ByteReadable>(&mut self) -> LenRead<T> {
29        let pos_before = self.bytes.position();
30        let value = T::read_from_bytes(self);
31        let pos_after = self.bytes.position();
32
33        LenRead {
34            value,
35            len: (pos_after - pos_before) as usize,
36        }
37    }
38
39    pub fn read_like<T: ByteReadableLike<Param = P>, P>(&mut self, input: &P) -> T {
40        T::read_from_bytes(self, input)
41    }
42
43    pub fn empty(&self) -> bool {
44        !self.bytes.has_remaining()
45    }
46
47    pub fn len(&self) -> usize {
48        self.bytes.remaining()
49    }
50
51    pub fn is_empty(&self) -> bool {
52        self.len() == 0
53    }
54
55    pub fn new(vec: Vec<u8>) -> ByteReader {
56        let bytes = Cursor::new(vec);
57        Self { bytes }
58    }
59}
60
61impl Read for ByteReader {
62    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
63        self.bytes.read(buf)
64    }
65}
66
67pub trait ByteReadable {
68    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self;
69}
70
71pub trait ByteReadableLike {
72    type Param;
73    fn read_from_bytes(byte_reader: &mut ByteReader, param: &Self::Param) -> Self;
74}
75
76impl ByteReadable for u8 {
77    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
78        byte_reader.bytes.get_u8()
79    }
80}
81
82impl ByteReadable for i32 {
83    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
84        byte_reader.bytes.get_i32()
85    }
86}
87
88impl ByteReadable for u32 {
89    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
90        byte_reader.bytes.get_u32()
91    }
92}
93
94impl ByteReadable for u16 {
95    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
96        byte_reader.bytes.get_u16()
97    }
98}
99
100impl ByteReadable for f64 {
101    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
102        byte_reader.bytes.get_f64()
103    }
104}
105
106impl<A: ByteReadable, B: ByteReadable> ByteReadable for (A, B) {
107    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
108        (byte_reader.read(), byte_reader.read())
109    }
110}
111
112impl<A: ByteReadable, B: ByteReadable, C: ByteReadable> ByteReadable for (A, B, C) {
113    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
114        (byte_reader.read(), byte_reader.read(), byte_reader.read())
115    }
116}
117
118impl<A: ByteReadable, B: ByteReadable, C: ByteReadable, D: ByteReadable> ByteReadable
119    for (A, B, C, D)
120{
121    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
122        (
123            byte_reader.read(),
124            byte_reader.read(),
125            byte_reader.read(),
126            byte_reader.read(),
127        )
128    }
129}
130
131impl<A: ByteReadable, B: ByteReadable, C: ByteReadable, D: ByteReadable, E: ByteReadable>
132    ByteReadable for (A, B, C, D, E)
133{
134    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
135        (
136            byte_reader.read(),
137            byte_reader.read(),
138            byte_reader.read(),
139            byte_reader.read(),
140            byte_reader.read(),
141        )
142    }
143}
144
145impl ByteReadable for f32 {
146    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
147        byte_reader.bytes.get_f32()
148    }
149}
150
151impl ByteReadable for i8 {
152    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
153        byte_reader.bytes.get_i8()
154    }
155}
156
157impl ByteReadable for u64 {
158    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
159        byte_reader.bytes.get_u64()
160    }
161}
162
163impl<const T: usize> ByteReadable for [u8; T] {
164    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
165        let mut bytes = [0; T];
166        for item in bytes.iter_mut() {
167            *item = byte_reader.read();
168        }
169        bytes
170    }
171}
172
173impl ByteReadable for bool {
174    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
175        let byte = byte_reader.bytes.get_u8();
176        !matches!(byte, 0)
177    }
178}
179
180impl ByteReadable for i16 {
181    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
182        byte_reader.bytes.get_i16()
183    }
184}
185
186impl ByteReadable for u128 {
187    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
188        byte_reader.bytes.get_u128()
189    }
190}
191
192impl<T: ByteReadable> ByteReadable for Vec<T> {
193    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
194        let VarUInt(length) = byte_reader.read();
195        (0..length).map(|_| byte_reader.read()).collect()
196    }
197}
198
199impl ByteReadable for String {
200    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
201        let bytes = byte_reader.read();
202        String::from_utf8(bytes).unwrap()
203    }
204}
205
206impl ByteReadable for BitField {
207    fn read_from_bytes(byte_reader: &mut ByteReader) -> Self {
208        let raw_byte: u8 = byte_reader.read();
209        BitField::from(raw_byte)
210    }
211}