wast_encoder/wasi_types/variants/
display.rs

1use 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}