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 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 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}