NimのCLIツール作成用ライブラリcligen
なぜコレを使うか、というとメチャクチャ簡単にオプションやサブコマンドを実装できるから cligenの使い方
インストールは nimble install cligen
以下のように定義するだけてオプションがヘルプメッセージもオプション解析もしてくれる
code:nim
proc sum(debug=false, args: seqstring): int = discard
when isMainModule:
import cligen
dispatch(sum)
dispatchという関数に関数名を渡すと、その関数の引数定義がそのままコマンドのオプションになるという驚異的な仕様
例えば以下のように、引数fooにデフォルト引数を定義すると、それに紐づくオプションは省略できる
逆にデフォルト引数を指定しなければ、そのオプションは必須になる
code:nim
proc sum(foo=0, bar: int, args: seqstring): int = discard
when isMainModule:
import cligen
dispatch(sum)
引数最後にseqを定義すると、それがオプション引数に該当しないもの全てが詰め込まられる
戻り値がそのままコマンドの終了コードになる
なので、異常系の場合は0以外を返すように実装する必要がある
引数のショートオプションは引数名の先頭1文字が採用される
先頭の文字が重複した場合は、あとのものはショートオプションなしになる
オプション名に別名をつけたい場合は、以下のようにすれば別の名前を決められる
$ dispatch(sum, short = {"foo": 'F'})
サブコマンドの定義もdispatchMultiという関数で同じように定義できる
cligenの嬉しいところ
オプション引数を格納するためのObject定義を書かなくて良い
これが一番うれしい
自前でoptparserとかで引数を取得するとObject定義と大体セットになってコード量がすごく増える
GoのcobraだとgetStringみたいな関数で値を取り出さないといけなかったのが不要 intのオプションに文字列を渡しても当然チェックしてプログラムを終了させてくれる
サブコマンドの定義が簡単
dispatchMultiするだけで良くてとてもお手軽にサブコマンドが定義できて快適すぎる
cligenのちょっと苦手なところ
ヘルプメッセージがみづらい
というよりヘルプメッセージの制御方法がわからない
関数にドキュメンテーションコメントを書けば、ヘルプ出力時に表示されるが、表示のされ方が微妙
以下は実際に作ったコマンドが出力したメッセージ
code:nim
Usage:
キャラクター保管所から探索者の能力値をスクレイピングしてきて、 任意のフォーマットで出力する。
Options(opt-arg sep :|=|spc):
-h, --help print this cligen-erated help
--help-syntax advanced: prepend,plurals,..
-f=, --format= string "csv" set format
-r, --recursive bool false set recursive
-X, --debug bool false set debug
-t=, --waitTime= int 1000 set waitTime
-l, --oneLine bool false set oneLine
-s, --sort bool false set sort
よりによってそこにテキスト入れるか?という感じ
公式もあまり役に立たないと思っているらしい
Compile it to fun (e.g., nim c fun.nim) and then run ./fun --help to get a minimal (but not so useless!) help message:
とはいえ
すごく簡単にCLIツールを作成できるようになるのでめちゃくちゃオススメ
Nimのオプションパーサー系ライブラリの中でも一番スターが多い
多分これがデファクトになっていくと思っている