1use oak_core::source::{SourceBuffer, ToSource};
2
3#[derive(Clone, Debug)]
5pub struct WatRoot {
6 pub items: Vec<WatItem>,
7}
8
9impl ToSource for WatRoot {
10 fn to_source(&self, buffer: &mut SourceBuffer) {
11 for item in &self.items {
12 item.to_source(buffer);
13 buffer.push("\n");
14 }
15 }
16}
17
18#[derive(Clone, Debug)]
20pub enum WatItem {
21 Module(WatModule),
22}
23
24impl ToSource for WatItem {
25 fn to_source(&self, buffer: &mut SourceBuffer) {
26 match self {
27 WatItem::Module(m) => m.to_source(buffer),
28 }
29 }
30}
31
32#[derive(Clone, Debug)]
34pub struct WatModule {
35 pub name: Option<String>,
36 pub items: Vec<WatModuleField>,
37}
38
39impl ToSource for WatModule {
40 fn to_source(&self, buffer: &mut SourceBuffer) {
41 buffer.push("(module");
42 if let Some(name) = &self.name {
43 buffer.push(" ");
44 buffer.push(name);
45 }
46 for item in &self.items {
47 buffer.push("\n ");
48 item.to_source(buffer);
49 }
50 buffer.push(")");
51 }
52}
53
54#[derive(Clone, Debug)]
56pub enum WatModuleField {
57 Func(WatFunc),
58 Import(WatImport),
59 Export(WatExport),
60 Type(WatType),
61 Table(WatTable),
62 Memory(WatMemory),
63 Global(WatGlobal),
64}
65
66impl ToSource for WatModuleField {
67 fn to_source(&self, buffer: &mut SourceBuffer) {
68 match self {
69 WatModuleField::Func(f) => f.to_source(buffer),
70 WatModuleField::Import(i) => i.to_source(buffer),
71 WatModuleField::Export(e) => e.to_source(buffer),
72 WatModuleField::Type(t) => t.to_source(buffer),
73 WatModuleField::Table(t) => t.to_source(buffer),
74 WatModuleField::Memory(m) => m.to_source(buffer),
75 WatModuleField::Global(g) => g.to_source(buffer),
76 }
77 }
78}
79
80#[derive(Clone, Debug)]
82pub struct WatFunc {
83 pub name: Option<String>,
84 pub params: Vec<WatParam>,
85 pub results: Vec<WatResult>,
86 pub locals: Vec<WatLocal>,
87 pub body: Vec<WatInstruction>,
88}
89
90impl ToSource for WatFunc {
91 fn to_source(&self, buffer: &mut SourceBuffer) {
92 buffer.push("(func");
93 if let Some(name) = &self.name {
94 buffer.push(" ");
95 buffer.push(name);
96 }
97 for param in &self.params {
98 buffer.push(" ");
99 param.to_source(buffer);
100 }
101 for result in &self.results {
102 buffer.push(" ");
103 result.to_source(buffer);
104 }
105 for local in &self.locals {
106 buffer.push(" ");
107 local.to_source(buffer);
108 }
109 for instr in &self.body {
110 buffer.push("\n ");
111 instr.to_source(buffer);
112 }
113 buffer.push(")");
114 }
115}
116
117#[derive(Clone, Debug)]
119pub struct WatParam {
120 pub name: Option<String>,
121 pub ty: WatTypeKind,
122}
123
124impl ToSource for WatParam {
125 fn to_source(&self, buffer: &mut SourceBuffer) {
126 buffer.push("(param");
127 if let Some(name) = &self.name {
128 buffer.push(" ");
129 buffer.push(name);
130 }
131 buffer.push(" ");
132 self.ty.to_source(buffer);
133 buffer.push(")");
134 }
135}
136
137#[derive(Clone, Debug)]
139pub struct WatResult {
140 pub ty: WatTypeKind,
141}
142
143impl ToSource for WatResult {
144 fn to_source(&self, buffer: &mut SourceBuffer) {
145 buffer.push("(result ");
146 self.ty.to_source(buffer);
147 buffer.push(")");
148 }
149}
150
151#[derive(Clone, Debug)]
153pub struct WatLocal {
154 pub name: Option<String>,
155 pub ty: WatTypeKind,
156}
157
158impl ToSource for WatLocal {
159 fn to_source(&self, buffer: &mut SourceBuffer) {
160 buffer.push("(local");
161 if let Some(name) = &self.name {
162 buffer.push(" ");
163 buffer.push(name);
164 }
165 buffer.push(" ");
166 self.ty.to_source(buffer);
167 buffer.push(")");
168 }
169}
170
171#[derive(Clone, Debug)]
173pub enum WatTypeKind {
174 I32,
175 I64,
176 F32,
177 F64,
178}
179
180impl ToSource for WatTypeKind {
181 fn to_source(&self, buffer: &mut SourceBuffer) {
182 match self {
183 WatTypeKind::I32 => buffer.push("i32"),
184 WatTypeKind::I64 => buffer.push("i64"),
185 WatTypeKind::F32 => buffer.push("f32"),
186 WatTypeKind::F64 => buffer.push("f64"),
187 }
188 }
189}
190
191#[derive(Clone, Debug)]
193pub struct WatInstruction {
194 pub name: String,
195}
196
197impl ToSource for WatInstruction {
198 fn to_source(&self, buffer: &mut SourceBuffer) {
199 buffer.push(&self.name);
200 }
201}
202
203#[derive(Clone, Debug)]
205pub struct WatImport {
206 pub module: String,
207 pub field: String,
208}
209
210impl ToSource for WatImport {
211 fn to_source(&self, buffer: &mut SourceBuffer) {
212 buffer.push("(import \"");
213 buffer.push(&self.module);
214 buffer.push("\" \"");
215 buffer.push(&self.field);
216 buffer.push("\")");
217 }
218}
219
220#[derive(Clone, Debug)]
222pub struct WatExport {
223 pub name: String,
224}
225
226impl ToSource for WatExport {
227 fn to_source(&self, buffer: &mut SourceBuffer) {
228 buffer.push("(export \"");
229 buffer.push(&self.name);
230 buffer.push("\")");
231 }
232}
233
234#[derive(Clone, Debug)]
236pub struct WatType {
237 pub name: Option<String>,
238}
239
240impl ToSource for WatType {
241 fn to_source(&self, buffer: &mut SourceBuffer) {
242 buffer.push("(type");
243 if let Some(name) = &self.name {
244 buffer.push(" ");
245 buffer.push(name);
246 }
247 buffer.push(")");
248 }
249}
250
251#[derive(Clone, Debug)]
253pub struct WatTable {
254 pub name: Option<String>,
255}
256
257impl ToSource for WatTable {
258 fn to_source(&self, buffer: &mut SourceBuffer) {
259 buffer.push("(table");
260 if let Some(name) = &self.name {
261 buffer.push(" ");
262 buffer.push(name);
263 }
264 buffer.push(")");
265 }
266}
267
268#[derive(Clone, Debug)]
270pub struct WatMemory {
271 pub name: Option<String>,
272}
273
274impl ToSource for WatMemory {
275 fn to_source(&self, buffer: &mut SourceBuffer) {
276 buffer.push("(memory");
277 if let Some(name) = &self.name {
278 buffer.push(" ");
279 buffer.push(name);
280 }
281 buffer.push(")");
282 }
283}
284
285#[derive(Clone, Debug)]
287pub struct WatGlobal {
288 pub name: Option<String>,
289}
290
291impl ToSource for WatGlobal {
292 fn to_source(&self, buffer: &mut SourceBuffer) {
293 buffer.push("(global");
294 if let Some(name) = &self.name {
295 buffer.push(" ");
296 buffer.push(name);
297 }
298 buffer.push(")");
299 }
300}