moonbit_component_generator/
get_script.rs1use 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 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}