未解決:RustのオプションパーサーClapは型を指定できない?
ざっと、見た感じで書いているため、実際は型を指定できるかもしれない。
なんの話?
普通--widthみたいなオプションだと数値であることを期待するように、オプションの値に型があるのは自然なこと。
clapはyamlで書いた定義みたいなものをマクロで読めるとかなんか面白いところで凝っていて、軽く調べた感じオプションパーサーのデファクトスタンダード的な感じなのでこれを使いたくなっている。あと-vvvとかの個数増える系もパースできるみたいで、これができることを謳っているパーサーはあまり見かけなく個人的な嗜好とちょっと違うけど面白い方向のオプションパーサー。 Issueがある
ざっと調べた感じだと、最近Issueが立っている。まだお返事ないみたいなのでduplicateしてたりするかもしれない。
現段階でIssueは150以上あって結構多い気がする。
以下のissueでは、バリデーションとして型の検査をするみたいな提案になっている様子。
以下のようにすればどうかという提案だと思われ、実際に使えるわけではないことに注意がいるはず。
code:rs
.arg(Arg::with_name("some_uint")
.required(true)
(...)
.validator(is_type::<u32>))
(...)
let some_uint = match matches.value_of("some_uint").parse::<u32>().unwrap();
(上記のissueから引用)
上記のparse::...のところはvalue_t!マクロが使えるかもしれない。
思うこと
型指定ができないという前提だとして、思うことを書く。
matchesを作るところで型を指定できるなら、値を取得するときにはその型で取得できることがコンパイル時にわかっていてほしい。yargsの型定義などはそうなっている。オプション時に指定した型で取れることしか許さない。scoptとかでもcase classに入れてくれるため、値にアクセスするときは正当な型で値を取得できる。型を指定する箇所が複数になり、どちらかを変え忘れる可能性のあるライブラリだと保守性が下がって困るなと思う。複数指定しても違う型になっていたらコンパイルエラーになるとかだと、少し面倒だけど安全なので、良いと思う。