1use alloc::{
7 collections::{BTreeMap, BTreeSet},
8 string::String,
9 vec::Vec,
10};
11
12use super::DeserializationError;
13
14mod byte_reader;
15#[cfg(feature = "std")]
16pub use byte_reader::ReadAdapter;
17pub use byte_reader::{ByteReader, SliceReader};
18
19mod byte_writer;
20pub use byte_writer::ByteWriter;
21
22pub trait Serializable {
27 fn write_into<W: ByteWriter>(&self, target: &mut W);
31
32 fn to_bytes(&self) -> Vec<u8> {
37 let mut result = Vec::with_capacity(self.get_size_hint());
38 self.write_into(&mut result);
39 result
40 }
41
42 fn get_size_hint(&self) -> usize {
46 0
47 }
48}
49
50impl<T: Serializable> Serializable for &T {
51 fn write_into<W: ByteWriter>(&self, target: &mut W) {
52 (*self).write_into(target)
53 }
54
55 fn get_size_hint(&self) -> usize {
56 (*self).get_size_hint()
57 }
58}
59
60impl Serializable for () {
61 fn write_into<W: ByteWriter>(&self, _target: &mut W) {}
62
63 fn get_size_hint(&self) -> usize {
64 0
65 }
66}
67
68impl<T1> Serializable for (T1,)
69where
70 T1: Serializable,
71{
72 fn write_into<W: ByteWriter>(&self, target: &mut W) {
73 self.0.write_into(target);
74 }
75
76 fn get_size_hint(&self) -> usize {
77 self.0.get_size_hint()
78 }
79}
80
81impl<T1, T2> Serializable for (T1, T2)
82where
83 T1: Serializable,
84 T2: Serializable,
85{
86 fn write_into<W: ByteWriter>(&self, target: &mut W) {
87 self.0.write_into(target);
88 self.1.write_into(target);
89 }
90
91 fn get_size_hint(&self) -> usize {
92 self.0.get_size_hint() + self.1.get_size_hint()
93 }
94}
95
96impl<T1, T2, T3> Serializable for (T1, T2, T3)
97where
98 T1: Serializable,
99 T2: Serializable,
100 T3: Serializable,
101{
102 fn write_into<W: ByteWriter>(&self, target: &mut W) {
103 self.0.write_into(target);
104 self.1.write_into(target);
105 self.2.write_into(target);
106 }
107
108 fn get_size_hint(&self) -> usize {
109 self.0.get_size_hint() + self.1.get_size_hint() + self.2.get_size_hint()
110 }
111}
112
113impl<T1, T2, T3, T4> Serializable for (T1, T2, T3, T4)
114where
115 T1: Serializable,
116 T2: Serializable,
117 T3: Serializable,
118 T4: Serializable,
119{
120 fn write_into<W: ByteWriter>(&self, target: &mut W) {
121 self.0.write_into(target);
122 self.1.write_into(target);
123 self.2.write_into(target);
124 self.3.write_into(target);
125 }
126
127 fn get_size_hint(&self) -> usize {
128 self.0.get_size_hint()
129 + self.1.get_size_hint()
130 + self.2.get_size_hint()
131 + self.3.get_size_hint()
132 }
133}
134
135impl<T1, T2, T3, T4, T5> Serializable for (T1, T2, T3, T4, T5)
136where
137 T1: Serializable,
138 T2: Serializable,
139 T3: Serializable,
140 T4: Serializable,
141 T5: Serializable,
142{
143 fn write_into<W: ByteWriter>(&self, target: &mut W) {
144 self.0.write_into(target);
145 self.1.write_into(target);
146 self.2.write_into(target);
147 self.3.write_into(target);
148 self.4.write_into(target);
149 }
150
151 fn get_size_hint(&self) -> usize {
152 self.0.get_size_hint()
153 + self.1.get_size_hint()
154 + self.2.get_size_hint()
155 + self.3.get_size_hint()
156 + self.4.get_size_hint()
157 }
158}
159
160impl<T1, T2, T3, T4, T5, T6> Serializable for (T1, T2, T3, T4, T5, T6)
161where
162 T1: Serializable,
163 T2: Serializable,
164 T3: Serializable,
165 T4: Serializable,
166 T5: Serializable,
167 T6: Serializable,
168{
169 fn write_into<W: ByteWriter>(&self, target: &mut W) {
170 self.0.write_into(target);
171 self.1.write_into(target);
172 self.2.write_into(target);
173 self.3.write_into(target);
174 self.4.write_into(target);
175 self.5.write_into(target);
176 }
177
178 fn get_size_hint(&self) -> usize {
179 self.0.get_size_hint()
180 + self.1.get_size_hint()
181 + self.2.get_size_hint()
182 + self.3.get_size_hint()
183 + self.4.get_size_hint()
184 + self.5.get_size_hint()
185 }
186}
187
188impl Serializable for u8 {
189 fn write_into<W: ByteWriter>(&self, target: &mut W) {
190 target.write_u8(*self);
191 }
192
193 fn get_size_hint(&self) -> usize {
194 core::mem::size_of::<u8>()
195 }
196}
197
198impl Serializable for u16 {
199 fn write_into<W: ByteWriter>(&self, target: &mut W) {
200 target.write_u16(*self);
201 }
202
203 fn get_size_hint(&self) -> usize {
204 core::mem::size_of::<u16>()
205 }
206}
207
208impl Serializable for u32 {
209 fn write_into<W: ByteWriter>(&self, target: &mut W) {
210 target.write_u32(*self);
211 }
212
213 fn get_size_hint(&self) -> usize {
214 core::mem::size_of::<u32>()
215 }
216}
217
218impl Serializable for u64 {
219 fn write_into<W: ByteWriter>(&self, target: &mut W) {
220 target.write_u64(*self);
221 }
222
223 fn get_size_hint(&self) -> usize {
224 core::mem::size_of::<u64>()
225 }
226}
227
228impl Serializable for u128 {
229 fn write_into<W: ByteWriter>(&self, target: &mut W) {
230 target.write_u128(*self);
231 }
232
233 fn get_size_hint(&self) -> usize {
234 core::mem::size_of::<u128>()
235 }
236}
237
238impl Serializable for usize {
239 fn write_into<W: ByteWriter>(&self, target: &mut W) {
240 target.write_usize(*self)
241 }
242
243 fn get_size_hint(&self) -> usize {
244 byte_writer::usize_encoded_len(*self as u64)
245 }
246}
247
248impl<T: Serializable> Serializable for Option<T> {
249 fn write_into<W: ByteWriter>(&self, target: &mut W) {
250 match self {
251 Some(v) => {
252 target.write_bool(true);
253 v.write_into(target);
254 },
255 None => target.write_bool(false),
256 }
257 }
258
259 fn get_size_hint(&self) -> usize {
260 core::mem::size_of::<bool>() + self.as_ref().map(|value| value.get_size_hint()).unwrap_or(0)
261 }
262}
263
264impl<T: Serializable, const C: usize> Serializable for [T; C] {
265 fn write_into<W: ByteWriter>(&self, target: &mut W) {
266 target.write_many(self)
267 }
268
269 fn get_size_hint(&self) -> usize {
270 let mut size = 0;
271 for item in self {
272 size += item.get_size_hint();
273 }
274 size
275 }
276}
277
278impl<T: Serializable> Serializable for [T] {
279 fn write_into<W: ByteWriter>(&self, target: &mut W) {
280 target.write_usize(self.len());
281 for element in self.iter() {
282 element.write_into(target);
283 }
284 }
285
286 fn get_size_hint(&self) -> usize {
287 let mut size = self.len().get_size_hint();
288 for element in self {
289 size += element.get_size_hint();
290 }
291 size
292 }
293}
294
295impl<T: Serializable> Serializable for Vec<T> {
296 fn write_into<W: ByteWriter>(&self, target: &mut W) {
297 target.write_usize(self.len());
298 target.write_many(self);
299 }
300
301 fn get_size_hint(&self) -> usize {
302 let mut size = self.len().get_size_hint();
303 for item in self {
304 size += item.get_size_hint();
305 }
306 size
307 }
308}
309
310impl<K: Serializable, V: Serializable> Serializable for BTreeMap<K, V> {
311 fn write_into<W: ByteWriter>(&self, target: &mut W) {
312 target.write_usize(self.len());
313 target.write_many(self);
314 }
315
316 fn get_size_hint(&self) -> usize {
317 let mut size = self.len().get_size_hint();
318 for item in self {
319 size += item.get_size_hint();
320 }
321 size
322 }
323}
324
325impl<T: Serializable> Serializable for BTreeSet<T> {
326 fn write_into<W: ByteWriter>(&self, target: &mut W) {
327 target.write_usize(self.len());
328 target.write_many(self);
329 }
330
331 fn get_size_hint(&self) -> usize {
332 let mut size = self.len().get_size_hint();
333 for item in self {
334 size += item.get_size_hint();
335 }
336 size
337 }
338}
339
340impl Serializable for str {
341 fn write_into<W: ByteWriter>(&self, target: &mut W) {
342 target.write_usize(self.len());
343 target.write_many(self.as_bytes());
344 }
345
346 fn get_size_hint(&self) -> usize {
347 self.len().get_size_hint() + self.len()
348 }
349}
350
351impl Serializable for String {
352 fn write_into<W: ByteWriter>(&self, target: &mut W) {
353 target.write_usize(self.len());
354 target.write_many(self.as_bytes());
355 }
356
357 fn get_size_hint(&self) -> usize {
358 self.len().get_size_hint() + self.len()
359 }
360}
361
362pub trait Deserializable: Sized {
367 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError>;
378
379 fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError> {
392 Self::read_from(&mut SliceReader::new(bytes))
393 }
394}
395
396impl Deserializable for () {
397 fn read_from<R: ByteReader>(_source: &mut R) -> Result<Self, DeserializationError> {
398 Ok(())
399 }
400}
401
402impl<T1> Deserializable for (T1,)
403where
404 T1: Deserializable,
405{
406 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
407 let v1 = T1::read_from(source)?;
408 Ok((v1,))
409 }
410}
411
412impl<T1, T2> Deserializable for (T1, T2)
413where
414 T1: Deserializable,
415 T2: Deserializable,
416{
417 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
418 let v1 = T1::read_from(source)?;
419 let v2 = T2::read_from(source)?;
420 Ok((v1, v2))
421 }
422}
423
424impl<T1, T2, T3> Deserializable for (T1, T2, T3)
425where
426 T1: Deserializable,
427 T2: Deserializable,
428 T3: Deserializable,
429{
430 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
431 let v1 = T1::read_from(source)?;
432 let v2 = T2::read_from(source)?;
433 let v3 = T3::read_from(source)?;
434 Ok((v1, v2, v3))
435 }
436}
437
438impl<T1, T2, T3, T4> Deserializable for (T1, T2, T3, T4)
439where
440 T1: Deserializable,
441 T2: Deserializable,
442 T3: Deserializable,
443 T4: Deserializable,
444{
445 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
446 let v1 = T1::read_from(source)?;
447 let v2 = T2::read_from(source)?;
448 let v3 = T3::read_from(source)?;
449 let v4 = T4::read_from(source)?;
450 Ok((v1, v2, v3, v4))
451 }
452}
453
454impl<T1, T2, T3, T4, T5> Deserializable for (T1, T2, T3, T4, T5)
455where
456 T1: Deserializable,
457 T2: Deserializable,
458 T3: Deserializable,
459 T4: Deserializable,
460 T5: Deserializable,
461{
462 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
463 let v1 = T1::read_from(source)?;
464 let v2 = T2::read_from(source)?;
465 let v3 = T3::read_from(source)?;
466 let v4 = T4::read_from(source)?;
467 let v5 = T5::read_from(source)?;
468 Ok((v1, v2, v3, v4, v5))
469 }
470}
471
472impl<T1, T2, T3, T4, T5, T6> Deserializable for (T1, T2, T3, T4, T5, T6)
473where
474 T1: Deserializable,
475 T2: Deserializable,
476 T3: Deserializable,
477 T4: Deserializable,
478 T5: Deserializable,
479 T6: Deserializable,
480{
481 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
482 let v1 = T1::read_from(source)?;
483 let v2 = T2::read_from(source)?;
484 let v3 = T3::read_from(source)?;
485 let v4 = T4::read_from(source)?;
486 let v5 = T5::read_from(source)?;
487 let v6 = T6::read_from(source)?;
488 Ok((v1, v2, v3, v4, v5, v6))
489 }
490}
491
492impl Deserializable for u8 {
493 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
494 source.read_u8()
495 }
496}
497
498impl Deserializable for u16 {
499 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
500 source.read_u16()
501 }
502}
503
504impl Deserializable for u32 {
505 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
506 source.read_u32()
507 }
508}
509
510impl Deserializable for u64 {
511 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
512 source.read_u64()
513 }
514}
515
516impl Deserializable for u128 {
517 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
518 source.read_u128()
519 }
520}
521
522impl Deserializable for usize {
523 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
524 source.read_usize()
525 }
526}
527
528impl<T: Deserializable> Deserializable for Option<T> {
529 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
530 let contains = source.read_bool()?;
531
532 match contains {
533 true => Ok(Some(T::read_from(source)?)),
534 false => Ok(None),
535 }
536 }
537}
538
539impl<T: Deserializable, const C: usize> Deserializable for [T; C] {
540 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
541 let data: Vec<T> = source.read_many(C)?;
542
543 let res = data.try_into().unwrap_or_else(|v: Vec<T>| {
546 panic!("Expected a Vec of length {} but it was {}", C, v.len())
547 });
548
549 Ok(res)
550 }
551}
552
553impl<T: Deserializable> Deserializable for Vec<T> {
554 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
555 let len = source.read_usize()?;
556 source.read_many(len)
557 }
558}
559
560impl<K: Deserializable + Ord, V: Deserializable> Deserializable for BTreeMap<K, V> {
561 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
562 let len = source.read_usize()?;
563 let data = source.read_many(len)?;
564 Ok(BTreeMap::from_iter(data))
565 }
566}
567
568impl<T: Deserializable + Ord> Deserializable for BTreeSet<T> {
569 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
570 let len = source.read_usize()?;
571 let data = source.read_many(len)?;
572 Ok(BTreeSet::from_iter(data))
573 }
574}
575
576impl Deserializable for String {
577 fn read_from<R: ByteReader>(source: &mut R) -> Result<Self, DeserializationError> {
578 let len = source.read_usize()?;
579 let data = source.read_many(len)?;
580
581 String::from_utf8(data)
582 .map_err(|err| DeserializationError::InvalidValue(format!("{}", err)))
583 }
584}