Help-first command-line parsing with docopt semantics and bounded reusable compilation
moon add jqlssg/moondocopt@0.1.0import {
"jqlssg/moondocopt" @docopt,
}
pkgtype(kind: "executable")///|
fn main {
try {
let parser = @docopt.Parser::new(
"Usage: greet <name> [--times=N]\nOptions:\n --times=N Repeat count [default: 1]",
)
let values = parser.parse(["MoonBit", "--times=2"])
let name = values.require_text("<name>")
let times = values.integer("--times", minimum=1, maximum=10)
for _ in 0..<times {
println("你好," + name)
}
} catch {
e => println("error: " + e.message())
}
}moon run . --target wasm-gc# 1. 数据处理工具:类型校验后求平均值并缩放,不只是显示解析字典
moon run examples/reduce --target wasm-gc -- mean 3 5 --scale=2
# {"operation":"mean","count":2,"result":8}
# 2. 迁移构建入口:把帮助文档定义的输入变成每个源文件的编译任务 argv
moon run examples/buildplan --target wasm-gc -- debug --define=LOG=1 src/a.c
# 一个任务:cc -c src/a.c -o build/object-0.o -g -DLOG=1
# 3. 应用内控制台:过滤宿主记录、排序、限量,再返回业务数据
moon run examples/console --target wasm-gc -- select --tag=core --limit=1
# {"matched":2,"rows":[{"id":"parser","score":90}]}let p = @docopt.Parser::new(
"Usage: tool [-v]... [--path=P]... <file>\nOptions:\n -v Verbose\n --path=P Search paths",
)
let v = p.parse(["-vv", "--path=a", "--path=b", "input.txt"])
assert_eq(v.count("-v"), 2)
assert_eq(v.texts("--path"), ["a", "b"])
assert_eq(v.require_text("<file>"), "input.txt")let p = @docopt.Parser::new("Usage: greet <name>")
let response = p.request_json("{\"argv\":[\"MoonBit\"],\"help\":false}")
assert_eq(response, ({"status":"parsed","values":{"<name>":"MoonBit"}} : Json))moon info
moon fmt
moon check --deny-warn
moon build --deny-warn --target wasm-gc
moon test --deny-warn --target wasm-gc
python scripts/check_workflows.py --target wasm-gc
python scripts/audit.py
# 重新生成独立上游/差分答案,无需联网或 pip
python scripts/generate_oracles.py
moon fmt
# 在 clean checkout 应无差异
git diff --exit-codepub(all) suberror DocoptError {
Language(String)
Arguments(String)
Limit(String)
Conversion(String)
} derive(Debug)pub struct Document {
text : String
usage : String
program : String
// private fields
}pub(all) struct Limits {
document_units : Int
usage_tokens : Int
options : Int
argv_count : Int
argv_units : Int
match_steps : Int
}pub struct OptionSpec {
short : String?
long : String?
takes_value : Bool
default_value : String?
}pub struct Parser {
// private fields
}fn Parser::normalize(self : Parser, argv : Array[String], options_first? : Bool) -> Array[ArgumentToken] raise DocoptErrorfn Parser::parse(self : Parser, argv : Array[String], options_first? : Bool) -> Values raise DocoptErrorfn Parser::parse_line(self : Parser, line : String, options_first? : Bool) -> Values raise DocoptErrorfn Parser::run(self : Parser, argv : Array[String], help? : Bool, version? : String?, options_first? : Bool) -> Outcome raise DocoptErrorpub struct UsageToken {
text : String
offset : Int
}fn Values::integer(self : Values, key : String, minimum? : Int, maximum? : Int) -> Int raise DocoptErrorfn split_command(line : String, comments? : Bool, max_words? : Int) -> Array[String] raise DocoptErrorInstall
Download zipHelp-first command-line parsing with docopt semantics and bounded reusable compilation