pchain_types/
serialization.rs

1/*
2    Copyright © 2023, ParallelChain Lab 
3    Licensed under the Apache License, Version 2.0: http://www.apache.org/licenses/LICENSE-2.0
4*/
5
6
7//! Traits for deterministic serialization of protocol-defined types. 
8
9pub trait Serializable: borsh::BorshSerialize {
10    fn serialize(&self) -> Vec<u8> {
11        self.try_to_vec().unwrap()
12    }
13}
14
15/// Deserializable encapsulates implementation of deserialization on data structures that are defined in pchain-types.
16pub trait Deserializable: borsh::BorshDeserialize {
17    fn deserialize(args: &[u8]) -> Result<Self, std::io::Error> {
18        Self::try_from_slice(args)
19    }
20}
21
22impl Serializable for u32 {}
23impl Deserializable for u32 {}
24
25impl Serializable for u64 {}
26impl Deserializable for u64 {}
27
28impl Serializable for Vec<u8> {}
29impl Deserializable for Vec<u8> {}
30
31impl Serializable for bool {}
32impl Deserializable for bool {}
33
34impl Serializable for String {}
35impl Deserializable for String {}
36
37impl<T: Serializable> Serializable for Option<T>{}
38impl<T: Deserializable> Deserializable for Option<T>{}
39
40impl<T: Serializable> Serializable for Vec<T> {}
41impl<T: Deserializable> Deserializable for Vec<T> {}
42
43impl<T1: Serializable> Serializable for (T1,) {}
44impl<T1: Deserializable> Deserializable for (T1,) {}
45
46impl<const N: usize> Serializable for [u8; N] {}
47impl<const N: usize> Deserializable for [u8; N] {}
48
49macro_rules! impl_tuple_serializable {
50    ($($idx:tt $name:ident)+) => {
51      impl<$($name: Serializable),+> Serializable for ($($name),+) {}
52    };
53}
54
55macro_rules! impl_tuple_deserializable {
56    ($($idx:tt $name:ident)+) => {
57        impl<$($name: Deserializable),+> Deserializable for ($($name),+) {}
58    };
59}
60
61impl_tuple_serializable!(0 T0 1 T1);
62impl_tuple_serializable!(0 T0 1 T1 2 T2);
63impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3);
64impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4);
65impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5);
66impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6);
67impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7);
68impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8);
69impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9);
70impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10);
71impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11);
72impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12);
73impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13);
74impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14);
75impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15);
76impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16);
77impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17);
78impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18);
79impl_tuple_serializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19);
80
81impl_tuple_deserializable!(0 T0 1 T1);
82impl_tuple_deserializable!(0 T0 1 T1 2 T2);
83impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3);
84impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4);
85impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5);
86impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6);
87impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7);
88impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8);
89impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9);
90impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10);
91impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11);
92impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12);
93impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13);
94impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14);
95impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15);
96impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16);
97impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17);
98impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18);
99impl_tuple_deserializable!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7 8 T8 9 T9 10 T10 11 T11 12 T12 13 T13 14 T14 15 T15 16 T16 17 T17 18 T18 19 T19);