diff --git a/assets/main.lua b/assets/main.lua new file mode 100644 index 0000000..7646f2c --- /dev/null +++ b/assets/main.lua @@ -0,0 +1,11 @@ +function boot() + -- ... +end + +function update() + -- ... +end + +function render() + firefly.clear_screen(firefly.RED) +end diff --git a/src/commands/new.rs b/src/commands/new.rs index a27d2e4..8aa1b5e 100644 --- a/src/commands/new.rs +++ b/src/commands/new.rs @@ -29,16 +29,17 @@ 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::Lua => new_lua(&args.name).context("new Lua project")?, Lang::Moon => new_moon(&args.name).context("new Moon project")?, } - write_config(&args.name)?; + write_config(&lang, &args.name)?; init_git(&args.name)?; println!("✅ project created"); Ok(()) } /// Create and dump firefly.toml config. -fn write_config(name: &str) -> Result<()> { +fn write_config(lang: &Lang, name: &str) -> Result<()> { use std::fmt::Write; let root = Path::new(name); @@ -51,6 +52,11 @@ fn write_config(name: &str) -> Result<()> { _ = writeln!(config, "author_name = \"{}\"", to_titlecase(&username)); _ = writeln!(config, "app_name = \"{}\"", to_titlecase(name)); + if matches!(lang, Lang::Lua) { + _ = writeln!(config, "\n[files]"); + _ = writeln!(config, r#"main = {{ path = "main.lua", copy = true }}"#); + } + std::fs::write(config_path, config).context("write config")?; Ok(()) } @@ -77,7 +83,8 @@ fn parse_lang(lang: &str) -> Result { "ts" | "typescript" | "js" | "javascript" => Lang::TS, "cpp" | "c++" => Lang::Cpp, "python" | "py" => Lang::Python, - "moon" | "moonbit" => Lang::Moon, + "moon" | "moonbit" | "mbt" => Lang::Moon, + "lua" => Lang::Lua, _ => bail!("unsupported language: {lang}"), }; Ok(result) @@ -146,6 +153,15 @@ fn new_c_or_cpp(name: &str, main: &str) -> Result<()> { Ok(()) } +/// Create a new Lua project. +fn new_lua(name: &str) -> Result<()> { + let mut c = Commander::default(); + c.cd(name)?; + c.copy_asset(&["main.lua"], "main.lua")?; + Ok(()) +} + +/// Create a new Moon project. fn new_moon(name: &str) -> Result<()> { check_installed("Moon", "moon", "version")?; let mut c = Commander::default(); diff --git a/src/config.rs b/src/config.rs index fa128dd..d7d66e3 100644 --- a/src/config.rs +++ b/src/config.rs @@ -184,4 +184,5 @@ pub enum Lang { Cpp, Python, Moon, + Lua, } diff --git a/src/langs.rs b/src/langs.rs index 92e0990..af0f753 100644 --- a/src/langs.rs +++ b/src/langs.rs @@ -28,6 +28,7 @@ pub fn build_bin(config: &Config, args: &BuildArgs) -> anyhow::Result<()> { Lang::C => build_c(config), Lang::Cpp => build_cpp(config), Lang::Python => build_python(config), + Lang::Lua => build_lua(config), Lang::Moon => build_moon(config), }?; let bin_path = config.rom_path.join(BIN); @@ -80,6 +81,9 @@ fn detect_lang(root: &Path) -> anyhow::Result { if root.join("main.cpp").exists() { return Ok(Lang::Cpp); } + if root.join("main.lua").exists() { + return Ok(Lang::Lua); + } if root.join("src").join("main.c").exists() { return Ok(Lang::C); } @@ -370,6 +374,22 @@ fn build_moon(config: &Config) -> anyhow::Result<()> { Ok(()) } +// Build Lua project. +fn build_lua(config: &Config) -> anyhow::Result<()> { + let from_path = config.root_path.join("main.wasm"); + if !from_path.is_file() { + let url = "https://github.com/firefly-zero/firefly-lua/releases/latest/download/main.wasm"; + let resp = ureq::get(url).call().context("send request")?; + let mut file = std::fs::File::create(&from_path).context("open main.wasm")?; + let mut body = resp.into_body(); + let mut body = body.as_reader(); + std::io::copy(&mut body, &mut file)?; + } + let out_path = config.rom_path.join(BIN); + std::fs::copy(&from_path, out_path).context("copy wasm binary")?; + Ok(()) +} + fn build_ts(_config: &Config) -> anyhow::Result<()> { todo!("TypeScript is not supported yet") }