wast_encoder/wasi_types/variants/
display.rs1use crate::helpers::TypeReference;
2
3use super::*;
4
5impl Hash for WasiVariantType {
6 fn hash<H: Hasher>(&self, state: &mut H) {
7 self.symbol.hash(state);
8 self.wasi_name.hash(state);
9 self.variants.iter().for_each(|v| {
10 v.hash(state);
11 });
12 }
13}
14
15impl AliasOuter for WasiVariantType {
16 fn alias_outer<W: Write>(&self, w: &mut WastEncoder<W>) -> std::fmt::Result {
17 w.newline()?;
18 let root = &w.source.name;
19 let id = self.symbol.wasi_id();
20 let name = self.wasi_name.as_str();
21 write!(w, "(alias outer ${root} {id} (type {id}?)) ")?;
22 write!(w, "(export {id} \"{name}\" (type (eq {id}?)))")
23 }
24}
25
26impl ComponentDefine for WasiVariantType {
27 fn component_define<W: Write>(&self, w: &mut WastEncoder<W>) -> std::fmt::Result {
28 write!(w, ";; variant {}", self.symbol)?;
29 w.newline()?;
30 write!(w, "(type {} (variant", self.symbol.wasi_id())?;
31 w.indent();
32 for variant in self.variants.values() {
33 w.newline()?;
34 variant.component_define(w)?;
35 }
36 w.dedent(2);
37 Ok(())
38 }
39}
40
41impl ComponentDefine for WasiVariantItem {
42 fn component_define<W: Write>(&self, w: &mut WastEncoder<W>) -> std::fmt::Result {
43 write!(w, ";; {}", self.symbol)?;
44 w.newline()?;
45 write!(w, "(case \"{}\"", self.wasi_name)?;
46 if let Some(s) = &self.fields {
47 w.write_char(' ')?;
48 s.upper_type(w)?
49 }
50 w.write_char(')')
51 }
52}