Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Clap の基本

コマンドライン引数を解析する

clap-badge cat-command-line-badge

このアプリケーションは、コマンドラインインターフェイスの構造を 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.