g_rust/protocol/vars/
packetvariable.rs

1use core::mem::size_of;
2use std::collections::HashMap;
3use std::fmt::Debug;
4use std::hash::Hash;
5use crate::protocol::hpacket::HPacket;
6use crate::protocol::vars::legacy::LegacyLength;
7
8pub trait PacketVariable {
9    /// Reads a variable from the beginning of the given bytes vector
10    ///
11    /// # Arguments
12    ///
13    ///
14    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized;
15    fn to_packet(&self) -> Vec<u8>;
16}
17
18fn to_sized_array<T: Clone + Debug, const N: usize>(v: Vec<T>) -> [T; N] {
19    v[..N].to_vec().try_into().expect("Not enough byte lefts to read")
20}
21
22macro_rules! impl_packet_variable {
23    ($($ty:ident)+) => ($(
24        impl PacketVariable for $ty {
25            fn from_packet(bytes: Vec<u8>) -> (Self, usize) {
26                let bytes_array: [u8; size_of::<$ty>()] = to_sized_array(bytes);
27                (Self::from_be_bytes(bytes_array), size_of::<$ty>())
28            }
29
30            fn to_packet(&self) -> Vec<u8> {
31                self.to_be_bytes().to_vec()
32            }
33        }
34    )+)
35}
36
37impl_packet_variable! { u8 i8 u16 i16 u32 i32 u64 i64 u128 i128 /*usize isize*/ f32 f64 }
38
39impl PacketVariable for bool {
40    fn from_packet(bytes: Vec<u8>) -> (Self, usize) {
41        (bytes[0] != 0, 1)
42    }
43
44    fn to_packet(&self) -> Vec<u8> {
45        if *self { vec![1] } else { vec![0] }
46    }
47}
48
49impl PacketVariable for String {
50    fn from_packet(bytes: Vec<u8>) -> (Self, usize) {
51        let s_size = u16::from_packet(bytes.clone()).0 as usize;
52        let s = String::from_utf8(bytes[2..2+s_size].to_vec()).expect("Couldn't read string");
53        (s, 2+s_size)
54    }
55
56    fn to_packet(&self) -> Vec<u8> {
57        let bytes = self.as_bytes();
58        let len = bytes.len() as u16;
59        let mut res = len.to_packet();
60        res.extend(bytes);
61        res
62    }
63}
64
65impl<T: PacketVariable + Clone> PacketVariable for Vec<T> {
66    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
67        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
68        let mut res: Vec<T> = Vec::new();
69
70        let len: LegacyLength = packet.read();
71        for _ in 0..*len {
72            res.push(packet.read());
73        }
74
75        (res, packet.read_index - 6)
76    }
77
78    fn to_packet(&self) -> Vec<u8> {
79        let mut packet = HPacket::from_header_id(0);
80        packet.append(LegacyLength(self.len() as i32));
81
82        for element in self.iter() {
83            packet.append(element.clone());
84        }
85
86        packet.get_bytes()[6..].to_vec()
87    }
88}
89
90impl<K: PacketVariable + Clone + Eq + Hash, V: PacketVariable + Clone> PacketVariable for HashMap<K, V> {
91    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
92        let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
93        let mut res: HashMap<K, V> = HashMap::new();
94
95        let len: LegacyLength = packet.read();
96        for _ in 0..*len {
97            res.insert(packet.read(), packet.read());
98        }
99
100        (res, packet.read_index - 6)
101    }
102
103    fn to_packet(&self) -> Vec<u8> {
104        let mut packet = HPacket::from_header_id(0);
105        packet.append(LegacyLength(self.len() as i32));
106
107        for (key, value) in self.iter() {
108            packet.append(key.clone());
109            packet.append(value.clone());
110        }
111
112        packet.get_bytes()[6..].to_vec()
113    }
114}
115
116macro_rules! impl_packet_tuple_variable {
117    ($($size:expr, $($ty:ident:$n:tt),+);+;) => ($(
118        impl<$($ty: PacketVariable + Clone),+> PacketVariable for ($($ty),+) {
119            fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
120                let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
121                (($(
122                    packet.read::<$ty>()
123                ),+), packet.read_index - 6)
124            }
125
126            fn to_packet(&self) -> Vec<u8> {
127                let mut packet = HPacket::from_header_id(0);
128                $(
129                    packet.append(self.$n.clone());
130                )+
131                packet.get_bytes()[6..].to_vec()
132            }
133        }
134    )+)
135}
136
137impl_packet_tuple_variable! {
138    2,  T0:0, T1:1;
139    3,  T0:0, T1:1, T2:2;
140    4,  T0:0, T1:1, T2:2, T3:3;
141    5,  T0:0, T1:1, T2:2, T3:3, T4:4;
142    6,  T0:0, T1:1, T2:2, T3:3, T4:4, T5:5;
143    7,  T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6;
144    8,  T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7;
145    9,  T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8;
146    10, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9;
147    11, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10;
148    12, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11;
149    13, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12;
150    14, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13;
151    15, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14;
152    16, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15;
153    17, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16;
154    18, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17;
155    19, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18;
156    20, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19;
157    21, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20;
158    22, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21;
159    23, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22;
160    24, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23;
161    25, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23, T24: 24;
162    26, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23, T24: 24, T25: 25;
163    27, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23, T24: 24, T25: 25, T26: 26;
164    28, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23, T24: 24, T25: 25, T26: 26, T27: 27;
165    29, T0:0, T1:1, T2:2, T3:3, T4:4, T5:5, T6:6, T7:7, T8:8, T9:9, T10:10, T11:11, T12:12, T13:13, T14:14, T15:15, T16:16, T17:17, T18:18, T19:19, T20: 20, T21: 21, T22: 22, T23: 23, T24: 24, T25: 25, T26: 26, T27: 27, T28: 28;
166}
167
168macro_rules! impl_packet_array_variable {
169    ($($size:expr),+) => ($(
170        impl<T: PacketVariable + Clone + Debug> PacketVariable for [T; $size] {
171            fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
172                let mut packet = HPacket::from_header_id_and_bytes(0, bytes);
173                let mut res: Vec<T> = Vec::new();
174                for _ in 0..$size {
175                    res.push(packet.read());
176                }
177                (to_sized_array::<T, $size>(res), packet.read_index - 6)
178            }
179
180            fn to_packet(&self) -> Vec<u8> {
181                let mut packet = HPacket::from_header_id(0);
182
183                for element in self.iter() {
184                    packet.append(element.clone());
185                }
186
187                packet.get_bytes()[6..].to_vec()
188            }
189        }
190    )+)
191}
192
193impl_packet_array_variable! { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }
194
195impl<T: PacketVariable> PacketVariable for Option<T> {
196    fn from_packet(bytes: Vec<u8>) -> (Self, usize) where Self: Sized {
197        if bytes.len() > 0 {
198            let (res, size) = T::from_packet(bytes);
199            (Some(res), size)
200        } else {
201            (None, 0)
202        }
203    }
204
205    fn to_packet(&self) -> Vec<u8> {
206        if self.is_some() {
207            self.as_ref().unwrap().to_packet()
208        } else {
209            vec![]
210        }
211    }
212}