wasm_encoder/component/
imports.rs1use crate::{
2 ComponentExportKind, ComponentSection, ComponentSectionId, ComponentValType, Encode,
3 encode_section,
4};
5use alloc::borrow::Cow;
6use alloc::string::String;
7use alloc::vec::Vec;
8
9#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
11pub enum TypeBounds {
12 Eq(u32),
14 SubResource,
16}
17
18impl Encode for TypeBounds {
19 fn encode(&self, sink: &mut Vec<u8>) {
20 match self {
21 Self::Eq(i) => {
22 sink.push(0x00);
23 i.encode(sink);
24 }
25 Self::SubResource => sink.push(0x01),
26 }
27 }
28}
29
30#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
32pub enum ComponentTypeRef {
33 Module(u32),
37 Func(u32),
41 Value(ComponentValType),
43 Type(TypeBounds),
45 Instance(u32),
49 Component(u32),
53}
54
55impl ComponentTypeRef {
56 pub fn kind(&self) -> ComponentExportKind {
58 match self {
59 Self::Module(_) => ComponentExportKind::Module,
60 Self::Func(_) => ComponentExportKind::Func,
61 Self::Value(_) => ComponentExportKind::Value,
62 Self::Type(..) => ComponentExportKind::Type,
63 Self::Instance(_) => ComponentExportKind::Instance,
64 Self::Component(_) => ComponentExportKind::Component,
65 }
66 }
67}
68
69impl Encode for ComponentTypeRef {
70 fn encode(&self, sink: &mut Vec<u8>) {
71 self.kind().encode(sink);
72
73 match self {
74 Self::Module(idx) | Self::Func(idx) | Self::Instance(idx) | Self::Component(idx) => {
75 idx.encode(sink);
76 }
77 Self::Value(ty) => ty.encode(sink),
78 Self::Type(bounds) => bounds.encode(sink),
79 }
80 }
81}
82
83#[derive(Clone, Debug, Default)]
114pub struct ComponentImportSection {
115 bytes: Vec<u8>,
116 num_added: u32,
117}
118
119impl ComponentImportSection {
120 pub fn new() -> Self {
122 Self::default()
123 }
124
125 pub fn len(&self) -> u32 {
127 self.num_added
128 }
129
130 pub fn is_empty(&self) -> bool {
132 self.num_added == 0
133 }
134
135 pub fn import<'a>(
137 &mut self,
138 name: impl Into<ComponentExternName<'a>>,
139 ty: ComponentTypeRef,
140 ) -> &mut Self {
141 name.into().encode(&mut self.bytes);
142 ty.encode(&mut self.bytes);
143 self.num_added += 1;
144 self
145 }
146}
147
148impl Encode for ComponentImportSection {
149 fn encode(&self, sink: &mut Vec<u8>) {
150 encode_section(sink, self.num_added, &self.bytes);
151 }
152}
153
154impl ComponentSection for ComponentImportSection {
155 fn id(&self) -> u8 {
156 ComponentSectionId::Import.into()
157 }
158}
159
160#[derive(Debug, Clone)]
162pub struct ComponentExternName<'a> {
163 pub name: Cow<'a, str>,
165 pub implements: Option<Cow<'a, str>>,
168}
169
170impl Encode for ComponentExternName<'_> {
171 fn encode(&self, bytes: &mut Vec<u8>) {
172 let mut options = Vec::new();
173
174 if let Some(s) = &self.implements {
175 options.push((0x00, s.as_bytes()));
176 }
177
178 if options.is_empty() {
179 bytes.push(0x00);
195 } else {
196 bytes.push(0x02);
197 }
198
199 self.name.encode(bytes);
200
201 if !options.is_empty() {
202 options.len().encode(bytes);
203 for (kind, val) in options {
204 bytes.push(kind);
205 val.encode(bytes);
206 }
207 }
208 }
209}
210
211impl<'a> From<&'a str> for ComponentExternName<'a> {
212 fn from(name: &'a str) -> Self {
213 ComponentExternName {
214 name: Cow::Borrowed(name),
215 implements: None,
216 }
217 }
218}
219
220impl<'a> From<&'a String> for ComponentExternName<'a> {
221 fn from(name: &'a String) -> Self {
222 ComponentExternName {
223 name: Cow::Borrowed(name),
224 implements: None,
225 }
226 }
227}
228
229impl<'a> From<String> for ComponentExternName<'a> {
230 fn from(name: String) -> Self {
231 ComponentExternName {
232 name: Cow::Owned(name),
233 implements: None,
234 }
235 }
236}
237
238#[cfg(feature = "wasmparser")]
239impl<'a> From<wasmparser::ComponentExternName<'a>> for ComponentExternName<'a> {
240 fn from(name: wasmparser::ComponentExternName<'a>) -> Self {
241 let wasmparser::ComponentExternName { name, implements } = name;
242 ComponentExternName {
243 name: name.into(),
244 implements: implements.map(|s| s.into()),
245 }
246 }
247}