wasm_encoder/component/
names.rs1use alloc::borrow::Cow;
2use alloc::vec::Vec;
3
4use super::*;
5use crate::{encoding_size, ExportKind, NameMap, SectionId};
6
7#[derive(Clone, Debug, Default)]
10pub struct ComponentNameSection {
11 bytes: Vec<u8>,
12}
13
14enum Subsection {
15 Component,
16 Decls,
17}
18
19impl ComponentNameSection {
20 pub fn new() -> Self {
22 Self::default()
23 }
24
25 pub fn component(&mut self, name: &str) {
31 let len = encoding_size(u32::try_from(name.len()).unwrap());
32 self.subsection_header(Subsection::Component, len + name.len());
33 name.encode(&mut self.bytes);
34 }
35
36 pub fn core_funcs(&mut self, names: &NameMap) {
39 self.core_decls(ExportKind::Func as u8, names)
40 }
41
42 pub fn core_tables(&mut self, names: &NameMap) {
45 self.core_decls(ExportKind::Table as u8, names)
46 }
47
48 pub fn core_memories(&mut self, names: &NameMap) {
51 self.core_decls(ExportKind::Memory as u8, names)
52 }
53
54 pub fn core_globals(&mut self, names: &NameMap) {
57 self.core_decls(ExportKind::Global as u8, names)
58 }
59
60 pub fn core_types(&mut self, names: &NameMap) {
63 self.core_decls(CORE_TYPE_SORT, names)
64 }
65
66 pub fn core_modules(&mut self, names: &NameMap) {
69 self.core_decls(CORE_MODULE_SORT, names)
70 }
71
72 pub fn core_instances(&mut self, names: &NameMap) {
75 self.core_decls(CORE_INSTANCE_SORT, names)
76 }
77
78 pub fn funcs(&mut self, names: &NameMap) {
81 self.component_decls(FUNCTION_SORT, names)
82 }
83
84 pub fn values(&mut self, names: &NameMap) {
87 self.component_decls(VALUE_SORT, names)
88 }
89
90 pub fn types(&mut self, names: &NameMap) {
93 self.component_decls(TYPE_SORT, names)
94 }
95
96 pub fn components(&mut self, names: &NameMap) {
99 self.component_decls(COMPONENT_SORT, names)
100 }
101
102 pub fn instances(&mut self, names: &NameMap) {
105 self.component_decls(INSTANCE_SORT, names)
106 }
107
108 pub fn raw(&mut self, id: u8, data: &[u8]) {
110 self.bytes.push(id);
111 data.encode(&mut self.bytes);
112 }
113
114 fn component_decls(&mut self, kind: u8, names: &NameMap) {
115 self.subsection_header(Subsection::Decls, 1 + names.size());
116 self.bytes.push(kind);
117 names.encode(&mut self.bytes);
118 }
119
120 fn core_decls(&mut self, kind: u8, names: &NameMap) {
121 self.subsection_header(Subsection::Decls, 2 + names.size());
122 self.bytes.push(CORE_SORT);
123 self.bytes.push(kind);
124 names.encode(&mut self.bytes);
125 }
126
127 fn subsection_header(&mut self, id: Subsection, len: usize) {
128 self.bytes.push(id as u8);
129 len.encode(&mut self.bytes);
130 }
131
132 pub fn is_empty(&self) -> bool {
134 self.bytes.is_empty()
135 }
136
137 pub fn as_custom<'a>(&'a self) -> CustomSection<'a> {
139 CustomSection {
140 name: "component-name".into(),
141 data: Cow::Borrowed(&self.bytes),
142 }
143 }
144}
145
146impl Encode for ComponentNameSection {
147 fn encode(&self, sink: &mut Vec<u8>) {
148 self.as_custom().encode(sink);
149 }
150}
151
152impl ComponentSection for ComponentNameSection {
153 fn id(&self) -> u8 {
154 SectionId::Custom.into()
155 }
156}