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