1#![cfg_attr(docsrs, feature(doc_auto_cfg))]
73#![no_std]
74#![deny(missing_docs, missing_debug_implementations)]
75
76extern crate alloc;
77#[cfg(feature = "std")]
78#[macro_use]
79extern crate std;
80
81#[cfg(feature = "component-model")]
82mod component;
83mod core;
84mod raw;
85#[cfg(feature = "wasmparser")]
86pub mod reencode;
87
88#[cfg(feature = "component-model")]
89pub use self::component::*;
90pub use self::core::*;
91pub use self::raw::*;
92
93use alloc::vec::Vec;
94
95pub trait Encode {
97 fn encode(&self, sink: &mut Vec<u8>);
99}
100
101impl<T: Encode + ?Sized> Encode for &'_ T {
102 fn encode(&self, sink: &mut Vec<u8>) {
103 T::encode(self, sink)
104 }
105}
106
107impl<T: Encode> Encode for [T] {
108 fn encode(&self, sink: &mut Vec<u8>) {
109 self.len().encode(sink);
110 for item in self {
111 item.encode(sink);
112 }
113 }
114}
115
116impl Encode for [u8] {
117 fn encode(&self, sink: &mut Vec<u8>) {
118 self.len().encode(sink);
119 sink.extend(self);
120 }
121}
122
123impl Encode for str {
124 fn encode(&self, sink: &mut Vec<u8>) {
125 self.len().encode(sink);
126 sink.extend_from_slice(self.as_bytes());
127 }
128}
129
130impl Encode for usize {
131 fn encode(&self, sink: &mut Vec<u8>) {
132 assert!(*self <= u32::max_value() as usize);
133 (*self as u32).encode(sink)
134 }
135}
136
137impl Encode for u32 {
138 fn encode(&self, sink: &mut Vec<u8>) {
139 let (value, pos) = leb128fmt::encode_u32(*self).unwrap();
140 sink.extend_from_slice(&value[..pos]);
141 }
142}
143
144impl Encode for i32 {
145 fn encode(&self, sink: &mut Vec<u8>) {
146 let (value, pos) = leb128fmt::encode_s32(*self).unwrap();
147 sink.extend_from_slice(&value[..pos]);
148 }
149}
150
151impl Encode for u64 {
152 fn encode(&self, sink: &mut Vec<u8>) {
153 let (value, pos) = leb128fmt::encode_u64(*self).unwrap();
154 sink.extend_from_slice(&value[..pos]);
155 }
156}
157
158impl Encode for i64 {
159 fn encode(&self, sink: &mut Vec<u8>) {
160 let (value, pos) = leb128fmt::encode_s64(*self).unwrap();
161 sink.extend_from_slice(&value[..pos]);
162 }
163}
164
165fn encode_vec<T, V>(elements: V, sink: &mut Vec<u8>)
166where
167 T: Encode,
168 V: IntoIterator<Item = T>,
169 V::IntoIter: ExactSizeIterator,
170{
171 let elements = elements.into_iter();
172 u32::try_from(elements.len()).unwrap().encode(sink);
173 for x in elements {
174 x.encode(sink);
175 }
176}
177
178impl<T> Encode for Option<T>
179where
180 T: Encode,
181{
182 fn encode(&self, sink: &mut Vec<u8>) {
183 match self {
184 Some(v) => {
185 sink.push(0x01);
186 v.encode(sink);
187 }
188 None => sink.push(0x00),
189 }
190 }
191}
192
193fn encoding_size(n: u32) -> usize {
194 let (_value, pos) = leb128fmt::encode_u32(n).unwrap();
195 pos
196}
197
198fn encode_section(sink: &mut Vec<u8>, count: u32, bytes: &[u8]) {
199 (encoding_size(count) + bytes.len()).encode(sink);
200 count.encode(sink);
201 sink.extend(bytes);
202}
203
204#[cfg(test)]
205mod test {
206 use super::*;
207
208 #[test]
209 fn test_encoding_size() {
210 assert_eq!(encoding_size(624485), 3);
211 }
212
213 #[test]
214 fn it_encodes_an_empty_module() {
215 let bytes = Module::new().finish();
216 assert_eq!(bytes, [0x00, b'a', b's', b'm', 0x01, 0x00, 0x00, 0x00]);
217 }
218
219 #[test]
220 fn it_encodes_an_empty_component() {
221 let bytes = Component::new().finish();
222 assert_eq!(bytes, [0x00, b'a', b's', b'm', 0x0d, 0x00, 0x01, 0x00]);
223 }
224}