From 935cdb7bdec1c77481877bc4c4e3a0824424da8a Mon Sep 17 00:00:00 2001 From: gram Date: Thu, 30 Oct 2025 17:41:09 +0100 Subject: [PATCH] Support new project for Moon --- .gitignore | 1 + assets/main.mbt | 26 ++++++++++++++++++++++++++ assets/moon.mod.json | 4 ++++ assets/moon.pkg.json | 9 +++++++++ src/commands/new.rs | 14 +++++++++++++- 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 assets/main.mbt create mode 100644 assets/moon.mod.json create mode 100644 assets/moon.pkg.json diff --git a/.gitignore b/.gitignore index e8149a4..85b3908 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /.task/ /test_app/target/ .zig-cache/ +/assets/target/ diff --git a/assets/main.mbt b/assets/main.mbt new file mode 100644 index 0000000..7ecad03 --- /dev/null +++ b/assets/main.mbt @@ -0,0 +1,26 @@ +///| +using @firefly {type Point, type Size, type Style} + +///| +fn main { + +} + +///| +pub fn boot() -> Unit { + // ... +} + +///| +pub fn update() -> Unit { + // ... +} + +///| +pub fn render() -> Unit { + @firefly.draw_rect( + Point::new(10, 10), + Size::new(40, 15), + Style::new_solid(LightGray), + ) +} diff --git a/assets/moon.mod.json b/assets/moon.mod.json new file mode 100644 index 0000000..6c160f6 --- /dev/null +++ b/assets/moon.mod.json @@ -0,0 +1,4 @@ +{ + "name": "app", + "preferred-target": "wasm" +} diff --git a/assets/moon.pkg.json b/assets/moon.pkg.json new file mode 100644 index 0000000..3642b8c --- /dev/null +++ b/assets/moon.pkg.json @@ -0,0 +1,9 @@ +{ + "is-main": true, + "import": ["applejag/firefly"], + "link": { + "wasm": { + "exports": ["boot", "update", "render"] + } + } +} diff --git a/src/commands/new.rs b/src/commands/new.rs index ad5157f..a27d2e4 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -29,7 +29,7 @@ pub fn cmd_new(args: &NewArgs) -> Result<()> { Lang::C => new_c(&args.name).context("new C project")?, Lang::Cpp => new_cpp(&args.name).context("new C++ project")?, Lang::Python => bail!("Python is not supported yet"), - Lang::Moon => bail!("Moon starter project is not supported yet"), + Lang::Moon => new_moon(&args.name).context("new Moon project")?, } write_config(&args.name)?; init_git(&args.name)?; @@ -77,6 +77,7 @@ fn parse_lang(lang: &str) -> Result { "ts" | "typescript" | "js" | "javascript" => Lang::TS, "cpp" | "c++" => Lang::Cpp, "python" | "py" => Lang::Python, + "moon" | "moonbit" => Lang::Moon, _ => bail!("unsupported language: {lang}"), }; Ok(result) @@ -145,6 +146,17 @@ fn new_c_or_cpp(name: &str, main: &str) -> Result<()> { Ok(()) } +fn new_moon(name: &str) -> Result<()> { + check_installed("Moon", "moon", "version")?; + let mut c = Commander::default(); + c.cd(name)?; + c.copy_asset(&["main.mbt"], "main.mbt")?; + c.copy_asset(&["moon.mod.json"], "moon.mod.json")?; + c.copy_asset(&["moon.pkg.json"], "moon.pkg.json")?; + c.run(&["moon", "add", "applejag/firefly"])?; + Ok(()) +} + #[derive(Default)] struct Commander<'a> { root: Option<&'a Path>,