///|
const DEFAULT_PORT : Int = 3000
///|
/// MoonBlox CLI — `moonblox-cli [args]`
async fn main {
let parser = @clap.Parser::new(
prog="moonblox-cli",
description="Markdown-first programmable site generator",
subcmds={
"init": @clap.SubCommand::new(
args={
"dir": @clap.Arg::positional(defaults=[""], help="Project directory"),
"headless": @clap.Arg::flag(
short='H',
help="Skip interactive TUI (CI mode)",
),
"theme": @clap.Arg::named(
short='t',
defaults=["blog"],
help="Project theme: blog or docs",
),
"empty": @clap.Arg::flag(
short='E',
help="Skip generating sample content",
),
"quiet": @clap.Arg::flag(
short='q',
help="Suppress non-essential output",
),
},
help="Scaffold a new MoonBlox project (pass --headless for CI)",
),
"build": @clap.SubCommand::new(
args={
"dir": @clap.Arg::positional(defaults=["."], help="Project directory"),
},
help="Build a static site to dist/",
),
"serve": @clap.SubCommand::new(
args={
"dir": @clap.Arg::positional(defaults=["."], help="Project directory"),
"port": @clap.Arg::named(
short='p',
defaults=["3000"],
help="Server port (default: 3000)",
),
},
help="Start dev server with live reload",
),
},
)
let value = @clap.SimpleValue::new(parser.prog)
let help = parser.parse(value, @env.args()[1:]) catch {
_ => {
println("Error parsing arguments")
return
}
}
match help {
Some(msg) => {
println(msg)
return
}
None => ()
}
match value.subcmd {
Some(cmd) =>
match cmd.name {
"init" => {
let dir = if cmd.positional_args.length() > 0 {
cmd.positional_args[0]
} else {
""
}
let headless = cmd.get_flag("headless") == Some(true)
let theme = cmd.get_one("theme") catch { _ => "blog" }
let empty = cmd.get_flag("empty") == Some(true)
let quiet = cmd.get_flag("quiet") == Some(true)
if headless {
if dir == "" || dir == "." {
abort(
"Error: --headless requires a project directory. Use: moonblox-cli init --headless",
)
} else {
match scaffold(dir, theme~, components=[], empty~, quiet~) {
Ok(_) => ()
Err(e) => abort("Scaffold failed: \{e}")
}
}
} else {
let default_dir = if dir == "" || dir == "." { "" } else { dir }
match init_tui(default_dir~) {
Some(name) => {
println("Created MoonBlox site at \{name}/")
println(" cd \{name} && moonblox-cli serve")
}
None =>
// TUI failed (non-TTY or error) — fall back to direct scaffold if dir provided
if dir != "" && dir != "." {
match
scaffold(
dir,
theme="blog",
components=[],
empty=false,
quiet=false,
) {
Ok(_) => {
println("Created MoonBlox site at \{dir}/")
println(" cd \{dir} && moonblox-cli serve")
}
Err(e) => println("Error: Scaffold failed: \{e}")
}
}
}
}
}
"build" => {
let dir = if cmd.positional_args.length() > 0 {
cmd.positional_args[0]
} else {
"."
}
let _ = build(dir)
}
"serve" => {
let dir = if cmd.positional_args.length() > 0 {
cmd.positional_args[0]
} else {
"."
}
let port_str = cmd.get_one("port") catch { _ => "3000" }
let p = @string.parse_int(port_str) catch { _ => DEFAULT_PORT }
let _ = serve(dir, p)
}
_ => println("Unknown command: \{cmd.name}")
}
None => {
let help_msg = parser.gen_help_message([parser.prog], {})
println(help_msg)
}
}
}