1use std::{
20 collections::VecDeque,
21 io::{Cursor, Error, ErrorKind, Read, Write},
22};
23
24#[cfg(feature = "derive")]
25pub use darkfi_derive::{SerialDecodable, SerialEncodable};
26
27#[cfg(feature = "async")]
28mod async_lib;
29#[cfg(feature = "async")]
30pub use async_lib::{
31 async_trait, deserialize_async, deserialize_async_partial, serialize_async, AsyncDecodable,
32 AsyncEncodable, AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt, FutAsyncReadExt,
33 FutAsyncWriteExt,
34};
35
36mod endian;
37mod types;
38
39pub trait Encodable {
41 fn encode<W: Write>(&self, e: &mut W) -> Result<usize, Error>;
45}
46
47pub trait Decodable: Sized {
49 fn decode<D: Read>(d: &mut D) -> Result<Self, Error>;
50}
51
52pub fn serialize<T: Encodable + ?Sized>(data: &T) -> Vec<u8> {
54 let mut encoder = Vec::new();
55 let len = data.encode(&mut encoder).unwrap();
56 assert_eq!(len, encoder.len());
57 encoder
58}
59
60pub fn deserialize_partial<T: Decodable>(data: &[u8]) -> Result<(T, usize), Error> {
63 let mut decoder = Cursor::new(data);
64 let rv = Decodable::decode(&mut decoder)?;
65 let consumed = decoder.position() as usize;
66
67 Ok((rv, consumed))
68}
69
70pub fn deserialize<T: Decodable>(data: &[u8]) -> Result<T, Error> {
73 let (rv, consumed) = deserialize_partial(data)?;
74
75 if consumed != data.len() {
77 return Err(Error::new(ErrorKind::Other, "Data not consumed fully on deserialization"))
78 }
79
80 Ok(rv)
81}
82
83pub trait WriteExt {
85 fn write_u128(&mut self, v: u128) -> Result<(), Error>;
87 fn write_u64(&mut self, v: u64) -> Result<(), Error>;
89 fn write_u32(&mut self, v: u32) -> Result<(), Error>;
91 fn write_u16(&mut self, v: u16) -> Result<(), Error>;
93 fn write_u8(&mut self, v: u8) -> Result<(), Error>;
95
96 fn write_i128(&mut self, v: i128) -> Result<(), Error>;
98 fn write_i64(&mut self, v: i64) -> Result<(), Error>;
100 fn write_i32(&mut self, v: i32) -> Result<(), Error>;
102 fn write_i16(&mut self, v: i16) -> Result<(), Error>;
104 fn write_i8(&mut self, v: i8) -> Result<(), Error>;
106
107 fn write_f64(&mut self, v: f64) -> Result<(), Error>;
109 fn write_f32(&mut self, v: f32) -> Result<(), Error>;
111
112 fn write_bool(&mut self, v: bool) -> Result<(), Error>;
114
115 fn write_slice(&mut self, v: &[u8]) -> Result<(), Error>;
117}
118
119pub trait ReadExt {
121 fn read_u128(&mut self) -> Result<u128, Error>;
123 fn read_u64(&mut self) -> Result<u64, Error>;
125 fn read_u32(&mut self) -> Result<u32, Error>;
127 fn read_u16(&mut self) -> Result<u16, Error>;
129 fn read_u8(&mut self) -> Result<u8, Error>;
131
132 fn read_i128(&mut self) -> Result<i128, Error>;
134 fn read_i64(&mut self) -> Result<i64, Error>;
136 fn read_i32(&mut self) -> Result<i32, Error>;
138 fn read_i16(&mut self) -> Result<i16, Error>;
140 fn read_i8(&mut self) -> Result<i8, Error>;
142
143 fn read_f64(&mut self) -> Result<f64, Error>;
145 fn read_f32(&mut self) -> Result<f32, Error>;
147
148 fn read_bool(&mut self) -> Result<bool, Error>;
150
151 fn read_slice(&mut self, slice: &mut [u8]) -> Result<(), Error>;
153}
154
155macro_rules! encoder_fn {
156 ($name:ident, $val_type:ty, $writefn:ident) => {
157 #[inline]
158 fn $name(&mut self, v: $val_type) -> Result<(), Error> {
159 self.write_all(&endian::$writefn(v))
160 }
161 };
162}
163
164macro_rules! decoder_fn {
165 ($name:ident, $val_type:ty, $readfn:ident, $byte_len:expr) => {
166 #[inline]
167 fn $name(&mut self) -> Result<$val_type, Error> {
168 assert_eq!(core::mem::size_of::<$val_type>(), $byte_len);
169 let mut val = [0; $byte_len];
170 self.read_exact(&mut val[..])?;
171 Ok(endian::$readfn(&val))
172 }
173 };
174}
175
176impl<W: Write> WriteExt for W {
177 encoder_fn!(write_u128, u128, u128_to_array_le);
178 encoder_fn!(write_u64, u64, u64_to_array_le);
179 encoder_fn!(write_u32, u32, u32_to_array_le);
180 encoder_fn!(write_u16, u16, u16_to_array_le);
181 encoder_fn!(write_i128, i128, i128_to_array_le);
182 encoder_fn!(write_i64, i64, i64_to_array_le);
183 encoder_fn!(write_i32, i32, i32_to_array_le);
184 encoder_fn!(write_i16, i16, i16_to_array_le);
185 encoder_fn!(write_f64, f64, f64_to_array_le);
186 encoder_fn!(write_f32, f32, f32_to_array_le);
187
188 #[inline]
189 fn write_i8(&mut self, v: i8) -> Result<(), Error> {
190 self.write_all(&[v as u8])
191 }
192 #[inline]
193 fn write_u8(&mut self, v: u8) -> Result<(), Error> {
194 self.write_all(&[v])
195 }
196 #[inline]
197 fn write_bool(&mut self, v: bool) -> Result<(), Error> {
198 self.write_all(&[v as u8])
199 }
200 #[inline]
201 fn write_slice(&mut self, v: &[u8]) -> Result<(), Error> {
202 self.write_all(v)
203 }
204}
205
206impl<R: Read> ReadExt for R {
207 decoder_fn!(read_u128, u128, slice_to_u128_le, 16);
208 decoder_fn!(read_u64, u64, slice_to_u64_le, 8);
209 decoder_fn!(read_u32, u32, slice_to_u32_le, 4);
210 decoder_fn!(read_u16, u16, slice_to_u16_le, 2);
211 decoder_fn!(read_i128, i128, slice_to_i128_le, 16);
212 decoder_fn!(read_i64, i64, slice_to_i64_le, 8);
213 decoder_fn!(read_i32, i32, slice_to_i32_le, 4);
214 decoder_fn!(read_i16, i16, slice_to_i16_le, 2);
215 decoder_fn!(read_f64, f64, slice_to_f64_le, 8);
216 decoder_fn!(read_f32, f32, slice_to_f32_le, 4);
217
218 #[inline]
219 fn read_u8(&mut self) -> Result<u8, Error> {
220 let mut slice = [0u8; 1];
221 self.read_exact(&mut slice)?;
222 Ok(slice[0])
223 }
224 #[inline]
225 fn read_i8(&mut self) -> Result<i8, Error> {
226 let mut slice = [0u8; 1];
227 self.read_exact(&mut slice)?;
228 Ok(slice[0] as i8)
229 }
230 #[inline]
231 fn read_bool(&mut self) -> Result<bool, Error> {
232 ReadExt::read_i8(self).map(|bit| bit != 0)
233 }
234 #[inline]
235 fn read_slice(&mut self, slice: &mut [u8]) -> Result<(), Error> {
236 self.read_exact(slice)
237 }
238}
239
240macro_rules! impl_int_encodable {
241 ($ty:ident, $meth_dec:ident, $meth_enc:ident) => {
242 impl Decodable for $ty {
243 #[inline]
244 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
245 ReadExt::$meth_dec(d).map($ty::from_le)
246 }
247 }
248
249 impl Encodable for $ty {
250 #[inline]
251 fn encode<S: WriteExt>(&self, s: &mut S) -> Result<usize, Error> {
252 s.$meth_enc(self.to_le())?;
253 Ok(core::mem::size_of::<$ty>())
254 }
255 }
256 };
257}
258
259impl_int_encodable!(u8, read_u8, write_u8);
260impl_int_encodable!(u16, read_u16, write_u16);
261impl_int_encodable!(u32, read_u32, write_u32);
262impl_int_encodable!(u64, read_u64, write_u64);
263impl_int_encodable!(u128, read_u128, write_u128);
264
265impl_int_encodable!(i8, read_i8, write_i8);
266impl_int_encodable!(i16, read_i16, write_i16);
267impl_int_encodable!(i32, read_i32, write_i32);
268impl_int_encodable!(i64, read_i64, write_i64);
269impl_int_encodable!(i128, read_i128, write_i128);
270
271#[derive(Debug, PartialEq, Eq)]
286pub struct VarInt(pub u64);
287
288impl VarInt {
289 #[inline]
296 pub fn length(&self) -> usize {
297 match self.0 {
298 0..=0xFC => 1,
299 0xFD..=0xFFFF => 3,
300 0x10000..=0xFFFFFFFF => 5,
301 _ => 9,
302 }
303 }
304}
305
306impl Encodable for VarInt {
307 #[inline]
308 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
309 match self.0 {
310 0..=0xFC => {
311 (self.0 as u8).encode(s)?;
312 Ok(1)
313 }
314
315 0xFD..=0xFFFF => {
316 s.write_u8(0xFD)?;
317 (self.0 as u16).encode(s)?;
318 Ok(3)
319 }
320
321 0x10000..=0xFFFFFFFF => {
322 s.write_u8(0xFE)?;
323 (self.0 as u32).encode(s)?;
324 Ok(5)
325 }
326
327 _ => {
328 s.write_u8(0xFF)?;
329 self.0.encode(s)?;
330 Ok(9)
331 }
332 }
333 }
334}
335
336impl Decodable for VarInt {
337 #[inline]
338 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
339 let n = ReadExt::read_u8(d)?;
340 match n {
341 0xFF => {
342 let x = ReadExt::read_u64(d)?;
343 if x < 0x100000000 {
344 return Err(Error::new(ErrorKind::Other, "Non-minimal VarInt"))
345 }
346 Ok(VarInt(x))
347 }
348
349 0xFE => {
350 let x = ReadExt::read_u32(d)?;
351 if x < 0x10000 {
352 return Err(Error::new(ErrorKind::Other, "Non-minimal VarInt"))
353 }
354 Ok(VarInt(x as u64))
355 }
356
357 0xFD => {
358 let x = ReadExt::read_u16(d)?;
359 if x < 0xFD {
360 return Err(Error::new(ErrorKind::Other, "Non-minimal VarInt"))
361 }
362 Ok(VarInt(x as u64))
363 }
364
365 n => Ok(VarInt(n as u64)),
366 }
367 }
368}
369
370macro_rules! tuple_encode {
371 ($($x:ident),*) => (
372 impl<$($x: Encodable),*> Encodable for ($($x),*) {
373 #[inline]
374 #[allow(non_snake_case)]
375 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
376 let &($(ref $x),*) = self;
377 let mut len = 0;
378 $(len += $x.encode(s)?;)*
379 Ok(len)
380 }
381 }
382
383 impl<$($x: Decodable),*> Decodable for ($($x),*) {
384 #[inline]
385 #[allow(non_snake_case)]
386 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
387 Ok(($({let $x = Decodable::decode(d)?; $x }),*))
388 }
389 }
390 )
391}
392
393tuple_encode!(T0, T1);
394tuple_encode!(T0, T1, T2);
395tuple_encode!(T0, T1, T2, T3);
396tuple_encode!(T0, T1, T2, T3, T4);
397tuple_encode!(T0, T1, T2, T3, T4, T5);
398tuple_encode!(T0, T1, T2, T3, T4, T5, T6);
399tuple_encode!(T0, T1, T2, T3, T4, T5, T6, T7);
400
401#[macro_export]
403macro_rules! encode_payload {
404 ($buf:expr, $($args:expr),*) => {{ $( $args.encode($buf)?;)* }}
405}
406
407impl Encodable for usize {
409 #[inline]
410 fn encode<S: WriteExt>(&self, s: &mut S) -> Result<usize, Error> {
411 s.write_u64(*self as u64)?;
412 Ok(8)
413 }
414}
415
416impl Decodable for usize {
417 #[inline]
418 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
419 Ok(ReadExt::read_u64(d)? as usize)
420 }
421}
422
423impl Encodable for f64 {
424 #[inline]
425 fn encode<S: WriteExt>(&self, s: &mut S) -> Result<usize, Error> {
426 s.write_f64(*self)?;
427 Ok(core::mem::size_of::<f64>())
428 }
429}
430
431impl Decodable for f64 {
432 #[inline]
433 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
434 ReadExt::read_f64(d)
435 }
436}
437
438impl Encodable for f32 {
439 #[inline]
440 fn encode<S: WriteExt>(&self, s: &mut S) -> Result<usize, Error> {
441 s.write_f32(*self)?;
442 Ok(core::mem::size_of::<f32>())
443 }
444}
445
446impl Decodable for f32 {
447 #[inline]
448 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
449 ReadExt::read_f32(d)
450 }
451}
452
453impl Encodable for bool {
454 #[inline]
455 fn encode<S: WriteExt>(&self, s: &mut S) -> Result<usize, Error> {
456 s.write_bool(*self)?;
457 Ok(1)
458 }
459}
460
461impl Decodable for bool {
462 #[inline]
463 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
464 ReadExt::read_bool(d)
465 }
466}
467
468impl<T: Encodable> Encodable for Vec<T> {
469 #[inline]
470 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
471 let mut len = 0;
472 len += VarInt(self.len() as u64).encode(s)?;
473 for val in self {
474 len += val.encode(s)?;
475 }
476 Ok(len)
477 }
478}
479
480impl<T: Decodable> Decodable for Vec<T> {
481 #[inline]
482 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
483 let len = VarInt::decode(d)?.0;
484 let mut ret = Vec::new();
485 ret.try_reserve(len as usize).map_err(|_| std::io::ErrorKind::InvalidData)?;
486 for _ in 0..len {
487 ret.push(Decodable::decode(d)?);
488 }
489 Ok(ret)
490 }
491}
492
493impl<T: Encodable> Encodable for VecDeque<T> {
494 #[inline]
495 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
496 let mut len = 0;
497 len += VarInt(self.len() as u64).encode(s)?;
498 for val in self {
499 len += val.encode(s)?;
500 }
501 Ok(len)
502 }
503}
504
505impl<T: Decodable> Decodable for VecDeque<T> {
506 #[inline]
507 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
508 let len = VarInt::decode(d)?.0;
509 let mut ret = VecDeque::new();
510 ret.try_reserve(len as usize).map_err(|_| std::io::ErrorKind::InvalidData)?;
511 for _ in 0..len {
512 ret.push_back(Decodable::decode(d)?);
513 }
514 Ok(ret)
515 }
516}
517
518impl<T: Encodable> Encodable for Option<T> {
519 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
520 let mut len = 0;
521 if let Some(v) = self {
522 len += true.encode(s)?;
523 len += v.encode(s)?;
524 } else {
525 len += false.encode(s)?;
526 }
527 Ok(len)
528 }
529}
530
531impl<T: Decodable> Decodable for Option<T> {
532 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
533 let valid: bool = Decodable::decode(d)?;
534 let val = if valid { Some(Decodable::decode(d)?) } else { None };
535 Ok(val)
536 }
537}
538
539impl<T, const N: usize> Encodable for [T; N]
540where
541 T: Encodable,
542{
543 #[inline]
544 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
545 let mut len = 0;
546 for elem in self.iter() {
547 len += elem.encode(s)?;
548 }
549 Ok(len)
550 }
551}
552
553impl<T, const N: usize> Decodable for [T; N]
554where
555 T: Decodable + core::fmt::Debug,
556{
557 #[inline]
558 fn decode<D: Read>(d: &mut D) -> Result<Self, Error> {
559 let mut ret = vec![];
560 for _ in 0..N {
561 ret.push(Decodable::decode(d)?);
562 }
563
564 Ok(ret.try_into().unwrap())
565 }
566}
567
568impl Encodable for String {
569 #[inline]
570 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
571 let b = self.as_bytes();
572 let b_len = b.len();
573 let vi_len = VarInt(b_len as u64).encode(s)?;
574 s.write_slice(b)?;
575 Ok(vi_len + b_len)
576 }
577}
578
579impl Encodable for &str {
580 #[inline]
581 fn encode<S: Write>(&self, s: &mut S) -> Result<usize, Error> {
582 let b = self.as_bytes();
583 let b_len = b.len();
584 let vi_len = VarInt(b_len as u64).encode(s)?;
585 s.write_slice(b)?;
586 Ok(vi_len + b_len)
587 }
588}
589
590impl Decodable for String {
591 #[inline]
592 fn decode<D: Read>(d: &mut D) -> Result<String, Error> {
593 match String::from_utf8(Decodable::decode(d)?) {
594 Ok(v) => Ok(v),
595 Err(_) => Err(Error::new(ErrorKind::Other, "Invalid UTF-8 for string")),
596 }
597 }
598}
599
600#[cfg(test)]
624mod tests {
625 use super::{endian::*, *};
626 use futures_lite::AsyncWriteExt;
627
628 #[test]
629 fn serialize_int_test() {
630 assert_eq!(serialize(&false), vec![0u8]);
632 assert_eq!(serialize(&true), vec![1u8]);
633 assert_eq!(serialize(&1u8), vec![1u8]);
635 assert_eq!(serialize(&0u8), vec![0u8]);
636 assert_eq!(serialize(&255u8), vec![255u8]);
637 assert_eq!(serialize(&1u16), vec![1u8, 0]);
639 assert_eq!(serialize(&256u16), vec![0u8, 1]);
640 assert_eq!(serialize(&5000u16), vec![136u8, 19]);
641 assert_eq!(serialize(&1u32), vec![1u8, 0, 0, 0]);
643 assert_eq!(serialize(&256u32), vec![0u8, 1, 0, 0]);
644 assert_eq!(serialize(&5000u32), vec![136u8, 19, 0, 0]);
645 assert_eq!(serialize(&500000u32), vec![32u8, 161, 7, 0]);
646 assert_eq!(serialize(&168430090u32), vec![10u8, 10, 10, 10]);
647 assert_eq!(serialize(&-1i32), vec![255u8, 255, 255, 255]);
649 assert_eq!(serialize(&-256i32), vec![0u8, 255, 255, 255]);
650 assert_eq!(serialize(&-5000i32), vec![120u8, 236, 255, 255]);
651 assert_eq!(serialize(&-500000i32), vec![224u8, 94, 248, 255]);
652 assert_eq!(serialize(&-168430090i32), vec![246u8, 245, 245, 245]);
653 assert_eq!(serialize(&1i32), vec![1u8, 0, 0, 0]);
654 assert_eq!(serialize(&256i32), vec![0u8, 1, 0, 0]);
655 assert_eq!(serialize(&5000i32), vec![136u8, 19, 0, 0]);
656 assert_eq!(serialize(&500000i32), vec![32u8, 161, 7, 0]);
657 assert_eq!(serialize(&168430090i32), vec![10u8, 10, 10, 10]);
658 assert_eq!(serialize(&1u64), vec![1u8, 0, 0, 0, 0, 0, 0, 0]);
660 assert_eq!(serialize(&256u64), vec![0u8, 1, 0, 0, 0, 0, 0, 0]);
661 assert_eq!(serialize(&5000u64), vec![136u8, 19, 0, 0, 0, 0, 0, 0]);
662 assert_eq!(serialize(&500000u64), vec![32u8, 161, 7, 0, 0, 0, 0, 0]);
663 assert_eq!(serialize(&723401728380766730u64), vec![10u8, 10, 10, 10, 10, 10, 10, 10]);
664 assert_eq!(serialize(&-1i64), vec![255u8, 255, 255, 255, 255, 255, 255, 255]);
666 assert_eq!(serialize(&-256i64), vec![0u8, 255, 255, 255, 255, 255, 255, 255]);
667 assert_eq!(serialize(&-5000i64), vec![120u8, 236, 255, 255, 255, 255, 255, 255]);
668 assert_eq!(serialize(&-500000i64), vec![224u8, 94, 248, 255, 255, 255, 255, 255]);
669 assert_eq!(
670 serialize(&-723401728380766730i64),
671 vec![246u8, 245, 245, 245, 245, 245, 245, 245]
672 );
673 assert_eq!(serialize(&1i64), vec![1u8, 0, 0, 0, 0, 0, 0, 0]);
674 assert_eq!(serialize(&256i64), vec![0u8, 1, 0, 0, 0, 0, 0, 0]);
675 assert_eq!(serialize(&5000i64), vec![136u8, 19, 0, 0, 0, 0, 0, 0]);
676 assert_eq!(serialize(&500000i64), vec![32u8, 161, 7, 0, 0, 0, 0, 0]);
677 assert_eq!(serialize(&723401728380766730i64), vec![10u8, 10, 10, 10, 10, 10, 10, 10]);
678 }
679
680 #[test]
681 fn serialize_float_test() {
682 assert_eq!(serialize(&1.5f64), vec![0u8, 0, 0, 0, 0, 0, 248, 63]);
684 assert_eq!(serialize(&256.7f64), vec![51u8, 51, 51, 51, 51, 11, 112, 64]);
685 assert_eq!(serialize(&5000.21f64), vec![41u8, 92, 143, 194, 53, 136, 179, 64]);
686 assert_eq!(serialize(&500000.314f64), vec![76u8, 55, 137, 65, 129, 132, 30, 65]);
687 assert_eq!(serialize(&1102021.1102021f64), vec![111u8, 52, 54, 28, 197, 208, 48, 65]);
688 assert_eq!(
689 serialize(&723401728380766730.894612f64),
690 vec![20u8, 20, 20, 20, 20, 20, 164, 67]
691 );
692 assert_eq!(serialize(&-1.5f64), vec![0u8, 0, 0, 0, 0, 0, 248, 191]);
693 assert_eq!(serialize(&-256.7f64), vec![51u8, 51, 51, 51, 51, 11, 112, 192]);
694 assert_eq!(serialize(&-5000.21f64), vec![41u8, 92, 143, 194, 53, 136, 179, 192]);
695 assert_eq!(serialize(&-500000.314f64), vec![76u8, 55, 137, 65, 129, 132, 30, 193]);
696 assert_eq!(serialize(&-1102021.1102021f64), vec![111u8, 52, 54, 28, 197, 208, 48, 193]);
697 assert_eq!(
698 serialize(&-723401728380766730.894612f64),
699 vec![20u8, 20, 20, 20, 20, 20, 164, 195]
700 );
701 assert_eq!(serialize(&1.5f32), vec![0u8, 0, 192, 63]);
703 assert_eq!(serialize(&256.7f32), vec![154u8, 89, 128, 67]);
704 assert_eq!(serialize(&5000.21f32), vec![174u8, 65, 156, 69]);
705 assert_eq!(serialize(&500000.3f32), vec![10u8, 36, 244, 72]);
706 assert_eq!(serialize(&1102021.1f32), vec![41u8, 134, 134, 73]);
707 assert_eq!(serialize(&72340172838076673.9f32), vec![129u8, 128, 128, 91]);
708 assert_eq!(serialize(&-1.5f32), vec![0u8, 0, 192, 191]);
709 assert_eq!(serialize(&-256.7f32), vec![154u8, 89, 128, 195]);
710 assert_eq!(serialize(&-5000.21f32), vec![174u8, 65, 156, 197]);
711 assert_eq!(serialize(&-500000.3f32), vec![10u8, 36, 244, 200]);
712 assert_eq!(serialize(&-1102021.1f32), vec![41u8, 134, 134, 201]);
713 assert_eq!(serialize(&-72340172838076673.9f32), vec![129u8, 128, 128, 219]);
714 }
715
716 #[test]
717 fn serialize_varint_test() {
718 assert_eq!(serialize(&VarInt(10)), vec![10u8]);
719 assert_eq!(serialize(&VarInt(0xFC)), vec![0xFCu8]);
720 assert_eq!(serialize(&VarInt(0xFD)), vec![0xFDu8, 0xFD, 0]);
721 assert_eq!(serialize(&VarInt(0xFFF)), vec![0xFDu8, 0xFF, 0xF]);
722 assert_eq!(serialize(&VarInt(0xF0F0F0F)), vec![0xFEu8, 0xF, 0xF, 0xF, 0xF]);
723 assert_eq!(
724 serialize(&VarInt(0xF0F0F0F0F0E0)),
725 vec![0xFFu8, 0xE0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0, 0]
726 );
727 assert_eq!(
728 test_varint_encode(0xFF, &u64_to_array_le(0x100000000)).unwrap(),
729 VarInt(0x100000000)
730 );
731 assert_eq!(test_varint_encode(0xFE, &u64_to_array_le(0x10000)).unwrap(), VarInt(0x10000));
732 assert_eq!(test_varint_encode(0xFD, &u64_to_array_le(0xFD)).unwrap(), VarInt(0xFD));
733
734 test_varint_len(VarInt(0), 1);
736 test_varint_len(VarInt(0xFC), 1);
737 test_varint_len(VarInt(0xFD), 3);
738 test_varint_len(VarInt(0xFFFF), 3);
739 test_varint_len(VarInt(0x10000), 5);
740 test_varint_len(VarInt(0xFFFFFFFF), 5);
741 test_varint_len(VarInt(0xFFFFFFFF + 1), 9);
742 test_varint_len(VarInt(u64::MAX), 9);
743 }
744
745 fn test_varint_len(varint: VarInt, expected: usize) {
746 let mut encoder = Cursor::new(vec![]);
747 assert_eq!(varint.encode(&mut encoder).unwrap(), expected);
748 assert_eq!(varint.length(), expected);
749 }
750
751 fn test_varint_encode(n: u8, x: &[u8]) -> Result<VarInt, Error> {
752 let mut input = [0u8; 9];
753 input[0] = n;
754 input[1..x.len() + 1].copy_from_slice(x);
755 deserialize_partial::<VarInt>(&input).map(|t| t.0)
756 }
757
758 #[test]
759 fn deserialize_nonminimal_vec() {
760 assert!(test_varint_encode(0xFF, &u64_to_array_le(0x100000000 - 1)).is_err());
762 assert!(test_varint_encode(0xFE, &u32_to_array_le(0x10000 - 1)).is_err());
763 assert!(test_varint_encode(0xFD, &u16_to_array_le(0xFD - 1)).is_err());
764 assert!(deserialize::<Vec<u8>>(&[0xfd, 0x00, 0x00]).is_err());
765 assert!(deserialize::<Vec<u8>>(&[0xfd, 0xfc, 0x00]).is_err());
766 assert!(deserialize::<Vec<u8>>(&[0xfd, 0xfc, 0x00]).is_err());
767 assert!(deserialize::<Vec<u8>>(&[0xfe, 0xff, 0x00, 0x00, 0x00]).is_err());
768 assert!(deserialize::<Vec<u8>>(&[0xfe, 0xff, 0xff, 0x00, 0x00]).is_err());
769 assert!(deserialize::<Vec<u8>>(&[0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
770 .is_err());
771 assert!(deserialize::<Vec<u8>>(&[0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00])
772 .is_err());
773
774 let mut vec_256 = vec![0; 259];
775 vec_256[0] = 0xfd;
776 vec_256[1] = 0x00;
777 vec_256[2] = 0x01;
778 assert!(deserialize::<Vec<u8>>(&vec_256).is_ok());
779
780 let mut vec_253 = vec![0; 256];
781 vec_253[0] = 0xfd;
782 vec_253[1] = 0xfd;
783 vec_253[2] = 0x00;
784 assert!(deserialize::<Vec<u8>>(&vec_253).is_ok());
785 }
786
787 #[test]
788 fn serialize_vector_test() {
789 assert_eq!(serialize(&vec![1u8, 2, 3]), vec![3u8, 1, 2, 3]);
790 assert_eq!(serialize(&vec![1u16, 2u16]), vec![2u8, 1, 0, 2, 0]);
791 assert_eq!(serialize(&vec![256u16, 5000u16]), vec![2u8, 0, 1, 136, 19]);
792 assert_eq!(
793 serialize(&vec![1u32, 256u32, 5000u32]),
794 vec![3u8, 1, 0, 0, 0, 0, 1, 0, 0, 136, 19, 0, 0]
795 );
796 assert_eq!(
797 serialize(&vec![1u64, 256u64, 5000u64, 500000u64]),
798 vec![
799 4u8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 136, 19, 0, 0, 0, 0, 0, 0, 32,
800 161, 7, 0, 0, 0, 0, 0
801 ]
802 );
803 assert_eq!(serialize(&vec![-1i8]), vec![1u8, 255]);
804 assert_eq!(serialize(&vec![1i8, -2i8, -3i8]), vec![3u8, 1, 254, 253]);
805 assert_eq!(serialize(&vec![-1i32]), vec![1u8, 255, 255, 255, 255]);
806 assert_eq!(serialize(&vec![-1i32, -256]), vec![2u8, 255, 255, 255, 255, 0, 255, 255, 255]);
807 assert_eq!(
808 serialize(&vec![-1i32, -2i32, -3i32]),
809 vec![3u8, 255, 255, 255, 255, 254, 255, 255, 255, 253, 255, 255, 255]
810 );
811 assert_eq!(
812 serialize(&vec![-1i64, -256i64, -5000i64, -500000i64]),
813 vec![
814 4u8, 255, 255, 255, 255, 255, 255, 255, 255, 0, 255, 255, 255, 255, 255, 255, 255,
815 120, 236, 255, 255, 255, 255, 255, 255, 224, 94, 248, 255, 255, 255, 255, 255
816 ]
817 );
818 }
819
820 #[test]
821 fn serialize_strbuf_test() {
822 assert_eq!(serialize(&"Andrew".to_string()), vec![6u8, 0x41, 0x6e, 0x64, 0x72, 0x65, 0x77]);
823 }
824
825 #[test]
826 fn deserialize_int_test() {
827 assert!((deserialize(&[58u8, 0]) as Result<bool, Error>).is_err());
829 assert_eq!(deserialize(&[58u8]).ok(), Some(true));
830 assert_eq!(deserialize(&[1u8]).ok(), Some(true));
831 assert_eq!(deserialize(&[0u8]).ok(), Some(false));
832 assert!((deserialize(&[0u8, 1]) as Result<bool, Error>).is_err());
833
834 assert_eq!(deserialize(&[58u8]).ok(), Some(58u8));
836
837 assert_eq!(deserialize(&[0x01u8, 0x02]).ok(), Some(0x0201u16));
839 assert_eq!(deserialize(&[0xABu8, 0xCD]).ok(), Some(0xCDABu16));
840 assert_eq!(deserialize(&[0xA0u8, 0x0D]).ok(), Some(0xDA0u16));
841 let failure16: Result<u16, Error> = deserialize(&[1u8]);
842 assert!(failure16.is_err());
843
844 assert_eq!(deserialize(&[0xABu8, 0xCD, 0, 0]).ok(), Some(0xCDABu32));
846 assert_eq!(deserialize(&[0xA0u8, 0x0D, 0xAB, 0xCD]).ok(), Some(0xCDAB0DA0u32));
847 let failure32: Result<u32, Error> = deserialize(&[1u8, 2, 3]);
848 assert!(failure32.is_err());
849
850 assert_eq!(deserialize(&[0x78u8, 0xec, 0xff, 0xff]).ok(), Some(-5000i32));
851 assert_eq!(deserialize(&[0xABu8, 0xCD, 0, 0]).ok(), Some(0xCDABi32));
852 assert_eq!(deserialize(&[0xA0u8, 0x0D, 0xAB, 0x2D]).ok(), Some(0x2DAB0DA0i32));
853 let failurei32: Result<i32, Error> = deserialize(&[1u8, 2, 3]);
854 assert!(failurei32.is_err());
855
856 assert_eq!(deserialize(&[0xABu8, 0xCD, 0, 0, 0, 0, 0, 0]).ok(), Some(0xCDABu64));
858 assert_eq!(
859 deserialize(&[0xA0u8, 0x0D, 0xAB, 0xCD, 0x99, 0, 0, 0x99]).ok(),
860 Some(0x99000099CDAB0DA0u64)
861 );
862 let failure64: Result<u64, Error> = deserialize(&[1u8, 2, 3, 4, 5, 6, 7]);
863 assert!(failure64.is_err());
864 assert_eq!(
865 deserialize(&[0xe0, 0x5e, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff]).ok(),
866 Some(-500000i64)
867 );
868 assert_eq!(deserialize(&[0xABu8, 0xCD, 0, 0, 0, 0, 0, 0]).ok(), Some(0xCDABi64));
869 assert_eq!(
870 deserialize(&[0xA0u8, 0x0D, 0xAB, 0xCD, 0x99, 0, 0, 0x99]).ok(),
871 Some(-0x66ffff663254f260i64)
872 );
873 let failurei64: Result<i64, Error> = deserialize(&[1u8, 2, 3, 4, 5, 6, 7]);
874 assert!(failurei64.is_err());
875 }
876 #[test]
877 fn deserialize_vec_test() {
878 assert_eq!(deserialize(&[3u8, 2, 3, 4]).ok(), Some(vec![2u8, 3, 4]));
879 assert!((deserialize(&[4u8, 2, 3, 4, 5, 6]) as Result<Vec<u8>, Error>).is_err());
880 }
881
882 #[test]
883 fn deserialize_strbuf_test() {
884 assert_eq!(
885 deserialize(&[6u8, 0x41, 0x6e, 0x64, 0x72, 0x65, 0x77]).ok(),
886 Some("Andrew".to_string())
887 );
888 }
889
890 #[test]
891 fn encode_payload_test() -> Result<(), Error> {
892 let mut i32_buf1 = vec![];
893 let mut i32_buf2 = vec![];
894 1_i32.encode(&mut i32_buf1)?;
895 2_i32.encode(&mut i32_buf2)?;
896
897 let mut string_buf = vec![];
898 b"Hello World".encode(&mut string_buf)?;
899
900 let mut buf = vec![];
907 let mut buf_verify = vec![];
908 buf_verify.extend_from_slice(&i32_buf1);
909 buf_verify.extend_from_slice(&i32_buf2);
910 buf_verify.extend_from_slice(&string_buf);
911
912 encode_payload!(&mut buf, 1_i32, 2_i32, b"Hello World");
913 assert_eq!(buf, buf_verify);
914
915 let mut f64_buf = vec![];
916 let mut i64_buf = vec![];
917 let mut bool_buf = vec![];
918 let mut u32_buf = vec![];
919 let mut array_buf = vec![];
920 1.5f64.encode(&mut f64_buf)?;
921 (-1i64).encode(&mut i64_buf)?;
922 true.encode(&mut bool_buf)?;
923 0x10000_u32.encode(&mut u32_buf)?;
924 [0xfe, 0xff, 0x00, 0x00, 0x00].encode(&mut array_buf)?;
925
926 let mut buf = vec![];
935 let mut buf_verify = vec![];
936 buf_verify.extend_from_slice(&f64_buf);
937 buf_verify.extend_from_slice(&i64_buf);
938 buf_verify.extend_from_slice(&bool_buf);
939 buf_verify.extend_from_slice(&u32_buf);
940 buf_verify.extend_from_slice(&array_buf);
941 encode_payload!(&mut buf, 1.5f64, -1i64, true, 0x10000_u32, [0xfe, 0xff, 0x00, 0x00, 0x00]);
942 assert_eq!(buf, buf_verify);
943
944 Ok(())
945 }
946
947 #[derive(Debug, PartialEq, SerialEncodable, SerialDecodable)]
948 enum TestEnum0 {
949 First,
950 Second,
951 Third,
952 }
953
954 #[derive(Debug, PartialEq, SerialEncodable, SerialDecodable)]
955 enum TestEnum1 {
956 First = 0x01,
957 Second = 0x03,
958 Third = 0xf1,
959 Fourth = 0xfe,
960 }
961
962 #[test]
963 fn derive_serialize_deserialize_enum() {
964 let first = serialize(&TestEnum0::First);
965 let second = serialize(&TestEnum0::Second);
966 let third = serialize(&TestEnum0::Third);
967 assert_eq!(deserialize::<TestEnum0>(&first).unwrap(), TestEnum0::First);
968 assert_eq!(deserialize::<TestEnum0>(&second).unwrap(), TestEnum0::Second);
969 assert_eq!(deserialize::<TestEnum0>(&third).unwrap(), TestEnum0::Third);
970
971 let first = serialize(&TestEnum1::First);
972 let second = serialize(&TestEnum1::Second);
973 let third = serialize(&TestEnum1::Third);
974 let fourth = serialize(&TestEnum1::Fourth);
975 assert_eq!(first, [0x01]);
976 assert_eq!(second, [0x03]);
977 assert_eq!(third, [0xf1]);
978 assert_eq!(fourth, [0xfe]);
979 }
980
981 #[derive(Debug, PartialEq, SerialEncodable, SerialDecodable)]
982 struct TestStruct0 {
983 foo: u64,
984 bar: bool,
985 baz: String,
986 }
987
988 #[derive(Debug, PartialEq, SerialEncodable, SerialDecodable)]
989 struct TestStruct1(String);
990
991 #[test]
992 fn derive_serialize_deserialize_struct() {
993 let foo = 44;
994 let bar = true;
995 let baz = String::from("foobarbaz");
996 let ts0 = TestStruct0 { foo, bar, baz: baz.clone() };
997 let ts0_s = serialize(&ts0);
998 let ts0_n = deserialize::<TestStruct0>(&ts0_s).unwrap();
999 assert_eq!(foo, ts0_n.foo);
1000 assert_eq!(bar, ts0_n.bar);
1001 assert_eq!(baz, ts0_n.baz);
1002 assert_eq!(ts0, ts0_n);
1003 assert_eq!(ts0_n, TestStruct0 { foo, bar, baz: baz.clone() });
1004
1005 let ts1 = TestStruct1(baz.clone());
1006 let ts1_s = serialize(&ts1);
1007 let ts1_n = deserialize::<TestStruct1>(&ts1_s).unwrap();
1008 assert_eq!(ts1, ts1_n);
1009 assert_eq!(ts1_n, TestStruct1(baz));
1010 }
1011}