1pub(crate) trait Encode {
2 fn encode(&self, e: &mut Vec<u8>);
3}
4
5impl<T: Encode + ?Sized> Encode for &'_ T {
6 fn encode(&self, e: &mut Vec<u8>) {
7 T::encode(self, e)
8 }
9}
10
11impl<T: Encode + ?Sized> Encode for Box<T> {
12 fn encode(&self, e: &mut Vec<u8>) {
13 T::encode(self, e)
14 }
15}
16
17impl<T: Encode> Encode for [T] {
18 fn encode(&self, e: &mut Vec<u8>) {
19 self.len().encode(e);
20 for item: &T in self {
21 item.encode(e);
22 }
23 }
24}
25
26impl<T: Encode> Encode for Vec<T> {
27 fn encode(&self, e: &mut Vec<u8>) {
28 <[T]>::encode(self, e)
29 }
30}
31
32impl Encode for str {
33 fn encode(&self, e: &mut Vec<u8>) {
34 self.len().encode(e);
35 e.extend_from_slice(self.as_bytes());
36 }
37}
38
39impl Encode for usize {
40 fn encode(&self, e: &mut Vec<u8>) {
41 assert!(*self <= u32::max_value() as usize);
42 (*self as u32).encode(e)
43 }
44}
45
46impl Encode for u8 {
47 fn encode(&self, e: &mut Vec<u8>) {
48 e.push(*self);
49 }
50}
51
52impl Encode for u32 {
53 fn encode(&self, e: &mut Vec<u8>) {
54 leb128::write::unsigned(w:e, (*self).into()).unwrap();
55 }
56}
57
58impl Encode for i32 {
59 fn encode(&self, e: &mut Vec<u8>) {
60 leb128::write::signed(w:e, (*self).into()).unwrap();
61 }
62}
63
64impl Encode for u64 {
65 fn encode(&self, e: &mut Vec<u8>) {
66 leb128::write::unsigned(w:e, *self).unwrap();
67 }
68}
69
70impl Encode for i64 {
71 fn encode(&self, e: &mut Vec<u8>) {
72 leb128::write::signed(w:e, *self).unwrap();
73 }
74}
75
76impl<T: Encode, U: Encode> Encode for (T, U) {
77 fn encode(&self, e: &mut Vec<u8>) {
78 self.0.encode(e);
79 self.1.encode(e);
80 }
81}
82
83impl<T: Encode, U: Encode, V: Encode> Encode for (T, U, V) {
84 fn encode(&self, e: &mut Vec<u8>) {
85 self.0.encode(e);
86 self.1.encode(e);
87 self.2.encode(e);
88 }
89}
90