swarm_bot_packets/
read.rs1use 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}