Rustのコマンドラインパーサーでパース結果をstructに落としてくれるライブラリ
#Rust #StructOpt #ライブラリ
Rustのコマンドラインパーサーをどうしようか考えていて、ClapのREADMEを読んで見つけたもの。
未解決:RustのオプションパーサーClapは型を指定できない?という状態で、ざっと見ただけで型の指定ぐらいは見つかりそうだが、見つからなかったので、代わりを探して見つけたもの。
https://gh-card.dev/repos/TeXitoi/structopt.svg https://github.com/TeXitoi/structopt
公式のREADMEを見れば使い方はすぐにわかる。structに落としてくれるため型とかの問題は全く問題なくてとても好きなスタイル。データ構造に落とすという点でScalaのscoptとかに似ているスタイル。以下に書かれてない使い方もあると思うけど、あっさりとした使い方なら以下でとても十分。-vvvみたいな数に関与するオプションもさばける様子。
code:rs
use std::path::PathBuf;
use structopt::StructOpt;
/// A basic example
#derive(StructOpt, Debug)
#structopt(name = "basic")
struct Opt {
// A flag, true if used in the command line. Note doc comment will
// be used for the help message of the flag. The name of the
// argument will be, by default, based on the name of the field.
/// Activate debug mode
#structopt(short, long)
debug: bool,
// The number of occurrences of the v/verbose flag
/// Verbose mode (-v, -vv, -vvv, etc.)
#structopt(short, long, parse(from_occurrences))
verbose: u8,
/// Set speed
#structopt(short, long, default_value = "42")
speed: f64,
/// Output file
#structopt(short, long, parse(from_os_str))
output: PathBuf,
// the long option will be translated by default to kebab case,
// i.e. --nb-cars.
/// Number of cars
#structopt(short = "c", long)
nb_cars: Option<i32>,
/// admin_level to consider
#structopt(short, long)
level: Vec<String>,
/// Files to process
#structopt(name = "FILE", parse(from_os_str))
files: Vec<PathBuf>,
}
fn main() {
let opt = Opt::from_args();
println!("{:#?}", opt);
}
良いところ
型が付く
フィールド名でオプションが引ける
(文字列とかで値を取り出すと、タイポなどで発見が遅れやすいバグが入り込みやすい。文字列でいいよて場合は、yargsの型定義みたいに文字列リテラルを駆使している場合など。)
フィールド名の上のコメントたちは--helpをしたときの説明文になってくれる。
内部でClapを使っているぽい
以下のStructOptのCargo.tomlを見るとClapに依存していることが分かる。
https://github.com/TeXitoi/structopt/blob/2e7f320a34dc22093d2e95e87ba827d769abda0a/Cargo.toml#L30-L31