Clap の基本
コマンドライン引数を解析する
このアプリケーションは、コマンドラインインターフェイスの構造を
clap のビルダースタイルを使って記述します。documentation では、
アプリケーションを生成するための他の 2 つの方法も紹介されています。
ビルダースタイルでは、それぞれの可能な引数を Arg
構造体で記述します。Arg::new() に渡される文字列は、その引数の内部
名です。short オプションと long オプションは、ユーザーが入力することになる
フラグを制御します。短いフラグは -f のようになり、長い
フラグは --file のようになります。
引数の値を取得するには get_one() メソッドを使用します。
このメソッドは、引数がユーザーによって指定されていた場合は
Some(&value) を返し、そうでない場合は None を返します。
PathBuf を使うのは、Linux や MacOS では有効でも
Rust の UTF-8 文字列では有効ではないファイルパスを扱えるようにするためです。これは
ベストプラクティスです。実際にはこのようなパスに遭遇することはかなりまれですが、
これがない状態でそうしたケースに出会うと
本当に厄介です。
use std::path::PathBuf;
use clap::{Arg, Command, builder::PathBufValueParser};
fn main() {
let matches = Command::new("My Test Program")
.version("0.1.0")
.about("Teaches argument parsing")
.arg(Arg::new("file")
.short('f')
.long("file")
.help("A cool file")
.value_parser(PathBufValueParser::default()))
.arg(Arg::new("num")
.short('n')
.long("number")
.help("Five less than your favorite number"))
.get_matches();
let default_file = PathBuf::from("input.txt");
let myfile: &PathBuf = matches.get_one("file").unwrap_or(&default_file);
println!("The file passed is: {}", myfile.display());
let num_str: Option<&String> = matches.get_one("num");
match num_str {
None => println!("No idea what your favorite number is."),
Some(s) => {
let parsed: Result<i32, _> = s.parse();
match parsed {
Ok(n) => println!("Your favorite number must be {}.", n + 5),
Err(_) => println!("That's not a number! {}", s),
}
}
}
}
使用方法の情報は clap -h によって生成されます。サンプル
アプリケーションの使用方法は次のようになります。
Teaches argument parsing
Usage: clap-cookbook [OPTIONS]
Options:
-f, --file <file> A cool file
-n, --number <num> Five less than your favorite number
-h, --help Print help
-V, --version Print version
次のようなコマンドを実行して、アプリケーションをテストできます。
$ cargo run -- -f myfile.txt -n 251
出力は次のとおりです。
The file passed is: myfile.txt
Your favorite number must be 256.