1use crate::{DeserializeResult, Deserialized, DeserializeErr};
2use crate::utils::take;
3use core::convert::TryInto;
4
5pub type ProtoByteOrder = BigEndian;
6
7pub trait ByteOrder {
8 fn write_u2long(v: u128) -> [u8; 16];
9
10 fn write_2long(v: i128) -> [u8; 16] {
11 Self::write_u2long(v as u128)
12 }
13
14 fn read_u2long(data: &[u8]) -> DeserializeResult<u128>;
15
16 fn read_2long(data: &[u8]) -> DeserializeResult<i128> {
17 Ok(Self::read_u2long(data)?.map(move |data| data as i128))
18 }
19
20 fn write_ulong(v: u64) -> [u8; 8];
21
22 fn write_long(v: i64) -> [u8; 8] {
23 Self::write_ulong(v as u64)
24 }
25
26 fn read_ulong(data: &[u8]) -> DeserializeResult<u64>;
27
28 fn read_long(data: &[u8]) -> DeserializeResult<i64> {
29 Ok(Self::read_ulong(data)?.map(move |data| data as i64))
30 }
31
32 fn write_uint(v: u32) -> [u8; 4];
33
34 fn write_int(v: i32) -> [u8; 4] {
35 Self::write_uint(v as u32)
36 }
37
38 fn read_uint(data: &[u8]) -> DeserializeResult<u32>;
39
40 fn read_int(data: &[u8]) -> DeserializeResult<i32> {
41 Ok(Self::read_uint(data)?.map(move |data| data as i32))
42 }
43
44 fn write_ushort(v: u16) -> [u8; 2];
45
46 fn write_short(v: i16) -> [u8; 2] {
47 Self::write_ushort(v as u16)
48 }
49
50 fn read_ushort(data: &[u8]) -> DeserializeResult<u16>;
51
52 fn read_short(data: &[u8]) -> DeserializeResult<i16> {
53 Ok(Self::read_ushort(data)?.map(move |data| data as i16))
54 }
55
56 fn write_ubyte(v: u8) -> [u8; 1] {
57 [v]
58 }
59
60 fn read_ubyte(data: &[u8]) -> DeserializeResult<u8> {
61 match data.split_first() {
62 Some((byte, rest)) => Deserialized::ok(*byte, rest),
63 None => Err(DeserializeErr::Eof)
64 }
65 }
66
67 fn write_byte(v: i8) -> [u8; 1] {
68 [v as u8]
69 }
70
71 fn read_byte(data: &[u8]) -> DeserializeResult<i8> {
72 Ok(Self::read_ubyte(data)?.map(move |b| b as i8))
73 }
74
75 fn write_float(v: f32) -> [u8; 4];
76
77 fn read_float(data: &[u8]) -> DeserializeResult<f32>;
78
79 fn write_double(v: f64) -> [u8; 8];
80
81 fn read_double(data: &[u8]) -> DeserializeResult<f64>;
82}
83
84pub struct BigEndian;
85
86impl ByteOrder for BigEndian {
87 fn write_u2long(v: u128) -> [u8; 16] {
88 [
89 ((v >> 120) as u8),
90 ((v >> 112) as u8),
91 ((v >> 104) as u8),
92 ((v >> 96) as u8),
93 ((v >> 88) as u8),
94 ((v >> 80) as u8),
95 ((v >> 72) as u8),
96 ((v >> 64) as u8),
97 ((v >> 56) as u8),
98 ((v >> 48) as u8),
99 ((v >> 40) as u8),
100 ((v >> 32) as u8),
101 ((v >> 24) as u8),
102 ((v >> 16) as u8),
103 ((v >> 8) as u8),
104 (v as u8),
105 ]
106 }
107
108 fn read_u2long(data: &[u8]) -> DeserializeResult<'_, u128> {
109 Ok(take(16, data)?.map(move |bytes| {
110 ((bytes[0] as u128) << 120) |
111 ((bytes[1] as u128) << 112) |
112 ((bytes[2] as u128) << 104) |
113 ((bytes[3] as u128) << 96) |
114 ((bytes[4] as u128) << 88) |
115 ((bytes[5] as u128) << 80) |
116 ((bytes[6] as u128) << 72) |
117 ((bytes[7] as u128) << 64) |
118 ((bytes[8] as u128) << 56) |
119 ((bytes[9] as u128) << 48) |
120 ((bytes[10] as u128) << 40) |
121 ((bytes[11] as u128) << 32) |
122 ((bytes[12] as u128) << 24) |
123 ((bytes[13] as u128) << 16) |
124 ((bytes[14] as u128) << 8) |
125 (bytes[15] as u128)
126 }))
127 }
128
129 fn write_ulong(v: u64) -> [u8; 8] {
130 [
131 ((v >> 56) as u8),
132 ((v >> 48) as u8),
133 ((v >> 40) as u8),
134 ((v >> 32) as u8),
135 ((v >> 24) as u8),
136 ((v >> 16) as u8),
137 ((v >> 8) as u8),
138 (v as u8),
139 ]
140 }
141
142 fn read_ulong(data: &[u8]) -> DeserializeResult<'_, u64> {
143 Ok(take(8, data)?.map(move |bytes| {
144 ((bytes[0] as u64) << 56) |
145 ((bytes[1] as u64) << 48) |
146 ((bytes[2] as u64) << 40) |
147 ((bytes[3] as u64) << 32) |
148 ((bytes[4] as u64) << 24) |
149 ((bytes[5] as u64) << 16) |
150 ((bytes[6] as u64) << 8) |
151 (bytes[7] as u64)
152 }))
153 }
154
155 fn write_uint(v: u32) -> [u8; 4] {
156 [
157 ((v >> 24) as u8),
158 ((v >> 16) as u8),
159 ((v >> 8) as u8),
160 (v as u8),
161 ]
162 }
163
164 fn read_uint(data: &[u8]) -> DeserializeResult<'_, u32> {
165 Ok(take(4, data)?.map(move |bytes| {
166 ((bytes[0] as u32) << 24) |
167 ((bytes[1] as u32) << 16) |
168 ((bytes[2] as u32) << 8) |
169 (bytes[3] as u32)
170 }))
171 }
172
173 fn write_ushort(v: u16) -> [u8; 2] {
174 [
175 ((v >> 8) as u8),
176 (v as u8),
177 ]
178 }
179
180 fn read_ushort(data: &[u8]) -> DeserializeResult<'_, u16> {
181 Ok(take(2, data)?
182 .map(move |bytes| ((bytes[0] as u16) << 8) | (bytes[1] as u16)))
183 }
184
185 fn write_float(v: f32) -> [u8; 4] {
186 v.to_be_bytes()
187 }
188
189 fn read_float(data: &[u8]) -> DeserializeResult<'_, f32> {
190 Ok(take(4, data)?.map(move |bytes| {
191 f32::from_be_bytes(bytes.try_into().expect("is exactly 4 long"))
192 }))
193
194 }
195
196 fn write_double(v: f64) -> [u8; 8] {
197 v.to_be_bytes()
198 }
199
200 fn read_double(data: &[u8]) -> DeserializeResult<'_, f64> {
201 Ok(take(8, data)?.map(move |bytes| {
202 f64::from_be_bytes(bytes.try_into().expect("is exactly 8 long"))
203 }))
204 }
205}
206
207pub struct LittleEndian;
208
209impl ByteOrder for LittleEndian {
210 fn write_u2long(v: u128) -> [u8; 16] {
211 [
212 v as u8,
213 (v >> 8) as u8,
214 (v >> 16) as u8,
215 (v >> 24) as u8,
216 (v >> 32) as u8,
217 (v >> 40) as u8,
218 (v >> 48) as u8,
219 (v >> 56) as u8,
220 (v >> 64) as u8,
221 (v >> 72) as u8,
222 (v >> 80) as u8,
223 (v >> 88) as u8,
224 (v >> 96) as u8,
225 (v >> 104) as u8,
226 (v >> 112) as u8,
227 (v >> 120) as u8,
228 ]
229 }
230
231 fn read_u2long(data: &[u8]) -> DeserializeResult<'_, u128> {
232 Ok(take(16, data)?.map(move |bytes| {
233 (bytes[0] as u128) |
234 ((bytes[1] as u128) << 8) |
235 ((bytes[2] as u128) << 16) |
236 ((bytes[3] as u128) << 24) |
237 ((bytes[4] as u128) << 32) |
238 ((bytes[5] as u128) << 40) |
239 ((bytes[6] as u128) << 48) |
240 ((bytes[7] as u128) << 56) |
241 ((bytes[8] as u128) << 64) |
242 ((bytes[9] as u128) << 72) |
243 ((bytes[10] as u128) << 80) |
244 ((bytes[11] as u128) << 88) |
245 ((bytes[12] as u128) << 96) |
246 ((bytes[13] as u128) << 104) |
247 ((bytes[14] as u128) << 112) |
248 ((bytes[15] as u128) << 120)
249 }))
250 }
251
252 fn write_ulong(v: u64) -> [u8; 8] {
253 [
254 v as u8,
255 (v >> 8) as u8,
256 (v >> 16) as u8,
257 (v >> 24) as u8,
258 (v >> 32) as u8,
259 (v >> 40) as u8,
260 (v >> 48) as u8,
261 (v >> 56) as u8
262 ]
263 }
264
265 fn read_ulong(data: &[u8]) -> DeserializeResult<'_, u64> {
266 Ok(take(8, data)?.map(move |bytes| {
267 (bytes[0] as u64) |
268 ((bytes[1] as u64) << 8) |
269 ((bytes[2] as u64) << 16) |
270 ((bytes[3] as u64) << 24) |
271 ((bytes[4] as u64) << 32) |
272 ((bytes[5] as u64) << 40) |
273 ((bytes[6] as u64) << 48) |
274 ((bytes[7] as u64) << 56)
275 }))
276 }
277
278 fn write_uint(v: u32) -> [u8; 4] {
279 [
280 v as u8,
281 (v >> 8) as u8,
282 (v >> 16) as u8,
283 (v >> 24) as u8,
284 ]
285 }
286
287 fn read_uint(data: &[u8]) -> DeserializeResult<'_, u32> {
288 Ok(take(4, data)?.map(move |bytes| {
289 (bytes[0] as u32) |
290 ((bytes[1] as u32) << 8) |
291 ((bytes[2] as u32) << 16) |
292 ((bytes[3] as u32) << 24)
293 }))
294 }
295
296 fn write_ushort(v: u16) -> [u8; 2] {
297 [
298 v as u8,
299 (v >> 8) as u8,
300 ]
301 }
302
303 fn read_ushort(data: &[u8]) -> DeserializeResult<'_, u16> {
304 Ok(take(4, data)?
305 .map(move |bytes| (bytes[0] as u16) | ((bytes[1] as u16) << 8)))
306 }
307
308 fn write_float(v: f32) -> [u8; 4] {
309 v.to_le_bytes()
310 }
311
312 fn read_float(data: &[u8]) -> DeserializeResult<'_, f32> {
313 Ok(take(4, data)?.map(move |bytes| {
314 f32::from_le_bytes(bytes.try_into().expect("is exactly 4 long"))
315 }))
316 }
317
318 fn write_double(v: f64) -> [u8; 8] {
319 v.to_le_bytes()
320 }
321
322 fn read_double(data: &[u8]) -> DeserializeResult<'_, f64> {
323 Ok(take(8, data)?.map(move |bytes| {
324 f64::from_le_bytes(bytes.try_into().expect("is exactly 8 long"))
325 }))
326 }
327}