1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use crate::{wasi_module::WasiModule, WasiInstance, WasiResource};

use super::*;

impl<'a, W: Write> WastEncoder<'a, W> {
    pub fn encode_instance(&mut self, instance: &WasiInstance) -> std::fmt::Result {
        write!(self, "(import \"{name}\" (instance ${name}", name = instance.module)?;
        self.indent(true);
        for (id, wasi) in instance.resources.values().enumerate() {
            if id != 0 {
                self.newline()?
            }
            self.export_resource(wasi)?;
        }
        self.dedent(true);
        write!(self, "))")?;
        self.newline()?;
        for (name, wasi) in &instance.resources {
            self.alias_export_resource(&instance.module, wasi, name)?;
            self.newline()?
        }
        Ok(())
    }
    fn export_resource(&mut self, resource: &WasiResource) -> std::fmt::Result {
        let name = self.encode_kebab(&resource.wasi_name);
        write!(self, "(export {name} (type (sub resource)))")
    }
    fn alias_export_resource(&mut self, module: &WasiModule, resource: &WasiResource, name: &str) -> std::fmt::Result {
        let id = self.encode_id(name);
        let name = self.encode_kebab(&resource.wasi_name);
        write!(self, "(alias export ${module} {name} (type {id}))")
    }
}