引数 API
CLI 引数のスキーマ定義と解析ヘルパーは ptool.args と p.args に
あります。
ptool.args.arg
v0.1.0- Introduced.
ptool.args.arg(id, kind, options) は、
ptool.args.parse(...).schema.args で使う引数ビルダーを作成します。
id(string, 必須): 引数識別子。返されるテーブルでもキーになります。kind(string, 必須): 引数タイプ。サポートされる値:"flag": 真偽値フラグ。"string": 文字列オプション。"int": 整数オプション (i64)。"positional": 位置引数。
options(table, 任意):ptool.args.parseの引数テーブルで使えるlong,short,help,required,multiple,defaultなどの 同じ任意フィールド。
このビルダーはメソッドチェーンをサポートしており、すべて自身を返します:
arg:long(value)は長いオプション名を設定します。positional以外の引数でのみサポートされます。arg:short(value)は短いオプション名を設定します。positional以外の引数でのみサポートされます。arg:help(value)はヘルプテキストを設定します。arg:required(value)はその引数が必須かどうかを設定します。valueを省略した場合のデフォルトはtrueです。arg:multiple(value)はその引数を繰り返し指定できるかどうかを設定します。valueを省略した場合のデフォルトはtrueです。arg:default(value)はデフォルト値を設定します。value = nilの場合は デフォルト値がクリアされます。
例:
local res = ptool.args.parse({
args = {
ptool.args.arg("name", "string"):required(),
ptool.args.arg("verbose", "flag", { short = "v" }),
ptool.args.arg("paths", "positional"):multiple(),
}
})
ptool.args.parse
v0.1.0- Introduced.
v0.3.0- Addedsubcommandssupport.
ptool.args.parse(schema) は clap を使ってスクリプト引数を解析し、
id をキーとするテーブルを返します。
スクリプト引数は ptool run <lua_file> -- ... の -- 以降から取得
されます。
たとえば:
ptool.use("v0.1.0")
local res = ptool.args.parse({
name = "test",
about = "The test command",
args = {
{ id = "name", kind = "string" }
}
})
print("Hello, " .. res.name .. "!")
スキーマ構造
name(string, 任意): ヘルプ出力に使われるコマンド名。デフォルトは スクリプトファイル名です。about(string, 任意): ヘルプ説明。args(table, 任意): 引数定義の配列。各要素は次の 2 形式を サポートします:- 引数テーブル。
ptool.args.arg(...)が返すビルダーオブジェクト。
subcommands(table, 任意): サブコマンド名からサブコマンドスキーマへの マップ。各サブコマンドスキーマはabout,args,subcommandsを 再帰的にサポートします。
args または subcommands の少なくともどちらか一方は指定する必要が
あります。
引数テーブルのフィールド:
id(string, 必須): 引数識別子。返されるテーブルでもキーになります。kind(string, 必須): 引数タイプ。サポートされる値:"flag": 真偽値フラグ。"string": 文字列オプション。"int": 整数オプション (i64)。"positional": 位置引数。
long(string, 任意):"name"のような長いオプション名 (--name) です。positional以外の引数では、デフォルト値をidから導出できます。short(string, 任意):-vの"v"のような 1 文字の短いオプション名。help(string, 任意): 引数のヘルプテキスト。required(boolean, 任意): その引数が必須かどうか。デフォルトはfalse。multiple(boolean, 任意): その引数を繰り返し指定できるかどうか。 デフォルトはfalse。default(string/integer, 任意): デフォルト値。
subcommands が存在する場合、現在のコマンドの args はそのコマンド
ツリー全体で共有されるオプションとして扱われ、選択したサブコマンドの前後
どちらでも受け付けられます。
サブコマンド付きの例:
local res = ptool.args.parse({
name = "demo",
args = {
ptool.args.arg("verbose", "flag", { short = "v" }),
ptool.args.arg("config", "string"),
},
subcommands = {
build = {
args = {
ptool.args.arg("release", "flag"),
},
subcommands = {
web = {
args = {
ptool.args.arg("out", "string"):required(),
},
},
},
},
clean = {
args = {
ptool.args.arg("all", "flag"),
},
},
},
})
制約
- 以下の制約は、引数テーブルとビルダー構文の両方に適用されます。
positional以外の引数ではlongとshortを省略できます。longを省略するとidが自動で使われます。positional引数ではlong,short,defaultを設定できません。positional.multiple = trueの場合、その引数はargsの最後である 必要があります。multiple = trueはstringとpositionalでのみサポートされます。defaultはstringとintでのみサポートされ、multiple = trueと同時には使えません。subcommandsが存在する場合、その同じスキーマ内ではpositional引数は許可されません。- トップレベルに
subcommandsがある場合、引数 idcommand_pathとargsは予約済みです。 - ひとつの選択されたサブコマンドパス上では、祖先と子孫のサブコマンドが
同じ引数
idを再利用することはできません。値が 1 つのargsテーブルにマージされるためです。
戻り値
Lua テーブルが返され、キーは id、値型は次のとおりです:
flag->booleanstring->string(multiple = trueの場合はstring[])int->integerpositional->string(multiple = trueの場合はstring[])
subcommands が存在しない場合、戻り値は上記のようなフラットな形のまま
です。
subcommands が存在する場合、戻り値は次の形になります:
- トップレベル
argsの値は、トップレベルテーブル上にそのまま返されます。 command_path->string[]: 一致したサブコマンドパス。たとえば{"build", "web"}。args->table: 一致したサブコマンドパスからマージされた引数値。
たとえば:
{
verbose = true,
config = "cfg.toml",
command_path = { "build", "web" },
args = {
release = true,
out = "dist",
},
}