darkfi_serial/
lib.rs

1/* This file is part of DarkFi (https://dark.fi)
2 *
3 * Copyright (C) 2020-2025 Dyne.org foundation
4 *
5 * This program is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU Affero General Public License as
7 * published by the Free Software Foundation, either version 3 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
17 */
18
19use 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
39/// Data which can be encoded in a consensus-consistent way.
40pub trait Encodable {
41    /// Encode an object with a well-defined format.
42    /// Should only ever error if the underlying `Write` errors.
43    /// Returns the number of bytes written on success.
44    fn encode<W: Write>(&self, e: &mut W) -> Result<usize, Error>;
45}
46
47/// Data which can be decoded in a consensus-consistent way.
48pub trait Decodable: Sized {
49    fn decode<D: Read>(d: &mut D) -> Result<Self, Error>;
50}
51
52/// Encode an object into a vector.
53pub 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
60/// Deserialize an object from a vector, but do not error if the entire
61/// vector is not consumed.
62pub 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
70/// Deserialize an object from a vector.
71/// Will error if said deserialization doesn't consume the entire vector.
72pub fn deserialize<T: Decodable>(data: &[u8]) -> Result<T, Error> {
73    let (rv, consumed) = deserialize_partial(data)?;
74
75    // Fail if data is not consumed entirely.
76    if consumed != data.len() {
77        return Err(Error::new(ErrorKind::Other, "Data not consumed fully on deserialization"))
78    }
79
80    Ok(rv)
81}
82
83/// Extensions of `Write` to encode data as per Bitcoin consensus.
84pub trait WriteExt {
85    /// Output a 128-bit unsigned int
86    fn write_u128(&mut self, v: u128) -> Result<(), Error>;
87    /// Output a 64-bit unsigned int
88    fn write_u64(&mut self, v: u64) -> Result<(), Error>;
89    /// Output a 32-bit unsigned int
90    fn write_u32(&mut self, v: u32) -> Result<(), Error>;
91    /// Output a 16-bit unsigned int
92    fn write_u16(&mut self, v: u16) -> Result<(), Error>;
93    /// Output an 8-bit unsigned int
94    fn write_u8(&mut self, v: u8) -> Result<(), Error>;
95
96    /// Output a 128-bit signed int
97    fn write_i128(&mut self, v: i128) -> Result<(), Error>;
98    /// Output a 64-bit signed int
99    fn write_i64(&mut self, v: i64) -> Result<(), Error>;
100    /// Ouptut a 32-bit signed int
101    fn write_i32(&mut self, v: i32) -> Result<(), Error>;
102    /// Output a 16-bit signed int
103    fn write_i16(&mut self, v: i16) -> Result<(), Error>;
104    /// Output an 8-bit signed int
105    fn write_i8(&mut self, v: i8) -> Result<(), Error>;
106
107    /// Output a 64-bit floating point int
108    fn write_f64(&mut self, v: f64) -> Result<(), Error>;
109    /// Output a 32-bit floating point int
110    fn write_f32(&mut self, v: f32) -> Result<(), Error>;
111
112    /// Output a boolean
113    fn write_bool(&mut self, v: bool) -> Result<(), Error>;
114
115    /// Output a byte slice
116    fn write_slice(&mut self, v: &[u8]) -> Result<(), Error>;
117}
118
119/// Extensions of `Read` to decode data as per Bitcoin consensus.
120pub trait ReadExt {
121    /// Read a 128-bit unsigned int
122    fn read_u128(&mut self) -> Result<u128, Error>;
123    /// Read a 64-bit unsigned int
124    fn read_u64(&mut self) -> Result<u64, Error>;
125    /// Read a 32-bit unsigned int
126    fn read_u32(&mut self) -> Result<u32, Error>;
127    /// Read a 16-bit unsigned int
128    fn read_u16(&mut self) -> Result<u16, Error>;
129    /// Read an 8-bit unsigned int
130    fn read_u8(&mut self) -> Result<u8, Error>;
131
132    /// Read a 128-bit signed int
133    fn read_i128(&mut self) -> Result<i128, Error>;
134    /// Read a 64-bit signed int
135    fn read_i64(&mut self) -> Result<i64, Error>;
136    /// Ouptut a 32-bit signed int
137    fn read_i32(&mut self) -> Result<i32, Error>;
138    /// Read a 16-bit signed int
139    fn read_i16(&mut self) -> Result<i16, Error>;
140    /// Read an 8-bit signed int
141    fn read_i8(&mut self) -> Result<i8, Error>;
142
143    /// Read a 64-bit floating point int
144    fn read_f64(&mut self) -> Result<f64, Error>;
145    /// Read a 32-bit floating point int
146    fn read_f32(&mut self) -> Result<f32, Error>;
147
148    /// Read a boolean
149    fn read_bool(&mut self) -> Result<bool, Error>;
150
151    /// Read a byte slice
152    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/// Variable-integer encoding.
272///
273/// Integer can be encoded depending on the represented value to save space.
274/// Variable length integers always precede an array/vector of a type of data
275/// that may vary in length. Longer numbers are encoded in little endian.
276///
277/// | Value         | Storage length | Format                              |
278/// |---------------|----------------|-------------------------------------|
279/// | <= 0xfc       | 1              | u8                                  |
280/// | <= 0xffff     | 3              | `0xfd` followed by `value` as `u16` |
281/// | <= 0xffffffff | 5              | `0xfe` followed by `value` as `u32` |
282/// | -             | 9              | `0xff` followed by `value` as `u64` |
283///
284/// See also [Bitcoin variable length integers](https://en.bitcoin.it/wiki/Protocol_documentation#Variable_length_integer).
285#[derive(Debug, PartialEq, Eq)]
286pub struct VarInt(pub u64);
287
288impl VarInt {
289    /// Gets the length of this `VarInt` when encoded.
290    /// Returns:
291    /// * 1 for 0..0xFC
292    /// * 3 for 0xFD..(2^16-1)
293    /// * 5 for 0x10000..(2^32-1)
294    /// * 9 otherwise
295    #[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/// Encode a dynamic set of arguments to a buffer.
402#[macro_export]
403macro_rules! encode_payload {
404    ($buf:expr, $($args:expr),*) => {{ $( $args.encode($buf)?;)* }}
405}
406
407// Implementations for some primitive types.
408impl 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/*
601impl Encodable for Cow<'static, str> {
602    #[inline]
603    fn encode<S: Write>(&self, mut s: S) -> Result<usize, Error> {
604        let b = self.as_bytes();
605        let b_len = b.len();
606        let vi_len = VarInt(b_len as u64).encode(&mut s)?;
607        s.write_slice(b)?;
608        Ok(vi_len + b_len)
609    }
610}
611
612impl Decodable for Cow<'static, str> {
613    #[inline]
614    fn decode<D: Read>(d: D) -> Result<Cow<'static, str>, Error> {
615        match String::from_utf8(Decodable::decode(d)?) {
616            Ok(v) => v.map(Cow::Owned),
617            Err(_) => Err(Error::new(ErrorKind::Other, "Invalid UTF-8 for string")),
618        }
619    }
620}
621*/
622
623#[cfg(test)]
624mod tests {
625    use super::{endian::*, *};
626    use futures_lite::AsyncWriteExt;
627
628    #[test]
629    fn serialize_int_test() {
630        // bool
631        assert_eq!(serialize(&false), vec![0u8]);
632        assert_eq!(serialize(&true), vec![1u8]);
633        // u8
634        assert_eq!(serialize(&1u8), vec![1u8]);
635        assert_eq!(serialize(&0u8), vec![0u8]);
636        assert_eq!(serialize(&255u8), vec![255u8]);
637        // u16
638        assert_eq!(serialize(&1u16), vec![1u8, 0]);
639        assert_eq!(serialize(&256u16), vec![0u8, 1]);
640        assert_eq!(serialize(&5000u16), vec![136u8, 19]);
641        // u32
642        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        // i32
648        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        // u64
659        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        // i64
665        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        // f64
683        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        // f32
702        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 that length calc is working correctly
735        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        // Check the edges for variant int
761        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        // bool
828        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        // u8
835        assert_eq!(deserialize(&[58u8]).ok(), Some(58u8));
836
837        // u16
838        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        // u32
845        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        // u64
857        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        /*
901        eprintln!("{:?}", i32_buf1);
902        eprintln!("{:?}", i32_buf2);
903        eprintln!("{:?}", string_buf);
904        */
905
906        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        /*
927        eprintln!("{:?}", f64_buf);
928        eprintln!("{:?}", i64_buf);
929        eprintln!("{:?}", bool_buf);
930        eprintln!("{:?}", u32_buf);
931        eprintln!("{:?}", array_buf);
932        */
933
934        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}