RustでCLI作成勉強~エラーメッセージには自身のファイル名も書く~

※まずはじめに、私の開発環境がWindowsであり、そのためWindows環境での言葉になってますがご容赦ください

最近簡単なCLIツールならRustで作れるようになろうと勉強しているのですが、今回は簡単なCLIツールを作り、それをコマンドプロンプトで動かすとどうなるかの備忘録です。

まず、適当な文字列を標準出力するようにプログラムを書き、ビルドしてexeファイルを作成します(名前は'rscli1.exe'としておきます。)

fn main() {
    let item: Vec<String> = vec![
        "Alice".to_string(),
        "Bob".to_string(),
        "13".to_string(),
        "231".to_string(),
        "Carol Dave".to_string(),
        "31, 15".to_string(),
        "Ellen 211".to_string(),
    ];
    for i in item {
        println!("{}", i);
    }
}

次に、標準入力に対し、引数で入力された文字で前後を修飾して標準出力するというプログラムを書き、ビルドしてexeファイルを作成します(名前は'rscli2.exe'としておきます。)

use std::io::Read;

fn main() {
    let args: Vec<String> = std::env::args().collect();
    if args.len() < 2 {
        eprintln!(" Wrong number of arguments");
        std::process::exit(1);
    }
    let mut buf = String::new();
    let stdin = std::io::stdin();
    let mut handle = stdin.lock();
    handle.read_to_string(&mut buf).unwrap();
    for line in buf.lines() {
        println!("{}{}{}", args[1], line, args[1]);
    }
}

さて、これで2つのexeファイル('rscli1.exe'と'rscli2.exe')が出来ました。この2つを実行してみましょう。2つのファイルを同じフォルダに置き、コマンドプロンプトでそのフォルダに移動した後、

rscli1 | rscli2 ++

と書いて実行すると

++Alice++
++Bob++
++13++
++231++
++Carol Dave++
++31, 15++
++Ellen 211++

と、意図した通り、標準入力に対して引数の"++"が前後に追加されています。

さて、ここまではいいですが、次に下記のように書いて実行してみます。

rscli1 | rscli2

引数がないので実行するとエラーになるわけですが、どのように表示されかというと

Wrong number of arguments

と、(まぁ当たり前ではありますが)ただメッセージが出るだけで、これではどのexeファイルで失敗したか分かりませんね。

こうならないようにするには、'rscli2.exe'のコードのeprinln!のメッセージを

        eprintln!("ERROR '{}'   Wrong number of arguments", &args[0]);

のように書き換え、どのexeファイルでエラーが出たかも出力するようにするとユーザーに優しい設計になるかと思います。