moonbit_component_generator/
get_script.rs

1use crate::MoonBitComponent;
2use anyhow::Context;
3use camino::Utf8Path;
4use std::fmt::Write;
5use wit_bindgen_core::uwriteln;
6
7pub fn generate_get_script_component(script: &str, target: &Utf8Path) -> anyhow::Result<()> {
8    let mut component = MoonBitComponent::empty_from_wit(
9        r#"
10            package golem:script-source;
11
12            world script-source {
13                export get-script: func() -> string;
14            }
15            "#,
16        Some("script-source"),
17    )?;
18
19    component
20        .define_bindgen_packages()
21        .context("Defining bindgen packages")?;
22
23    let mut stub_mbt = String::new();
24    uwriteln!(stub_mbt, "// Generated by `moonbit-component-generator`");
25    uwriteln!(stub_mbt, "");
26    uwriteln!(stub_mbt, "pub fn get_script() -> String {{");
27    for line in script.lines() {
28        uwriteln!(stub_mbt, "    #|{line}");
29    }
30    uwriteln!(stub_mbt, "}}");
31
32    component
33        .write_world_stub(&stub_mbt)
34        .context("Writing world stub")?;
35
36    component
37        .build(None, target)
38        .context("Building component")?;
39
40    Ok(())
41}
42
43#[cfg(test)]
44use crate::Trace;
45#[cfg(test)]
46test_r::inherit_test_dep!(Trace);
47
48#[cfg(test)]
49mod tests {
50    use crate::Trace;
51    use camino::Utf8Path;
52    use indoc::indoc;
53    use test_r::{inherit_test_dep, test};
54
55    inherit_test_dep!(Trace);
56
57    #[test]
58    fn generate_get_script_component(_trace: &Trace) -> anyhow::Result<()> {
59        let script = indoc! {
60            r#"export function hello() {
61                 return "Hello, World!";
62            }"#
63        };
64        let target = Utf8Path::new("target/test-output/generate_get_script_component.wasm");
65
66        super::generate_get_script_component(script, target)?;
67
68        // Testing with external wasmtime-cli
69        let output = std::process::Command::new("wasmtime")
70            .arg("--invoke")
71            .arg("get-script()")
72            .arg(Utf8Path::new(
73                "target/test-output/generate_get_script_component.wasm",
74            ))
75            .output()?;
76
77        assert_eq!(
78            output.stdout.trim_ascii_end(),
79            r#""export function hello() {\n     return \"Hello, World!\";\n}""#.as_bytes()
80        );
81
82        Ok(())
83    }
84}