// main.mbt — moon-weblink command-line tool: entry point and dispatch.
//
// The tool reads input exclusively from the `--input` argument. This MoonBit
// toolchain version exposes no stdin facility and `fn main` must return
// `Unit` (there is no portable way to set the process exit code), so the CLI
// reports every outcome as one deterministic line of stdout text, which makes
// it safe to script by grepping that text. The same binary builds unchanged
// for the wasm, wasm-gc, js and native targets. Each target prefixes
// `@env.args()` differently (native/wasm-gc: `[program, args...]`, js:
// `[node, program.js, args...]`); `split_command` normalizes those prefixes
// via `strip_program_name` so the parser sees the same user arguments on
// every backend.
///|
fn main {
run_cli(@env.args())
}
///|
fn run_cli(args : Array[String]) -> Unit {
let (cmd, rest) = split_command(args)
let opts = parse_options(rest)
if opts.unknown != "" {
println("error: unknown option \{opts.unknown}")
println("run `weblink-tool help` for usage")
return
}
if cmd == "help" {
print_usage()
return
}
if cmd == "version" {
println(version_banner())
return
}
if opts.help {
print_command_usage(cmd)
return
}
match cmd {
"parse" => cmd_parse(opts)
"validate" => cmd_validate(opts)
"canonicalize" => cmd_canonicalize(opts)
"query" => cmd_query(opts)
"to-linkset-json" => cmd_to_linkset_json(opts)
"from-linkset-json" => cmd_from_linkset_json(opts)
"to-linkset-text" => cmd_to_linkset_text(opts)
"relation" => cmd_relation(opts)
"audit" => cmd_audit(opts)
"stats" => cmd_stats(opts)
_ => {
println("error: unknown command '\{cmd}'")
println("run `weblink-tool help` for usage")
}
}
}
///|
fn print_usage() -> Unit {
println("weblink-tool — RFC 8288 Web Linking and RFC 9264 Linkset toolkit")
println("usage: weblink-tool [options]")
println("")
println("commands:")
println(" parse parse a Link header field value into links")
println(" validate parse and report valid/invalid")
println(" canonicalize emit the canonical Link header form")
println(" query find links by relation, media type, or hreflang")
println(
" to-linkset-json convert a Link header to application/linkset+json",
)
println(
" from-linkset-json convert application/linkset+json to a Link header",
)
println(" to-linkset-text convert to application/linkset (multiline text)")
println(" relation query the offline IANA relation registry")
println(" audit audit a Link header for issues")
println(" stats print library and registry statistics")
println(" version print the version")
println(" help show this help")
println("")
println("options:")
println(" --input the input string (required by most commands)")
println(" --limits limits preset: default | strict | permissive")
println(" --json machine-readable JSON output (parse, audit)")
println(" --rel query: filter by relation type")
println(" --type query: filter by media type")
println(" --hreflang query: filter by hreflang language tag")
println(" --list relation: list the whole registry")
println(" --count relation: print only the registry count")
println(" --help show this help")
}
///|
fn print_command_usage(cmd : String) -> Unit {
println("weblink-tool \{cmd} — see `weblink-tool help` for general usage")
}