前回の続き。
コマンドラインで取得したファイルを読み出す処理、パラメータが無かったら標準入力から入力するコードです。
use clap::Parser;
use std::fs::File;
use std::io::{stdin, BufRead, BufReader};
#[derive(Parser, Debug)]
#[clap(
name = "My RPM program",
version = "1.0.0",
author = "Your name",
about = "Super awesome sample RPM calculator"
)]
struct Opts {
#[clap(short, long)]
verbose: bool,
#[clap(name = "FILE")]
formula_file: Option<String>,
}
fn main() {
let opts = Opts::parse();
if let Some(path) = opts.formula_file {
// ファイルから読み出す
let f = File::open(path).unwrap();
let reader = BufReader::new(f);
run(reader, opts.verbose);
} else {
// 標準入力から読み出す
let stdin = stdin();
let reader = stdin.lock();
run(reader, opts.verbose);
}
}
fn run<R: BufRead>(reader: R, verbose: bool) {
for line in reader.lines() {
let line = line.unwrap();
println!("{}", line);
}
}
Some()は変数がエラーを許容する書き方らしい。
つまりは、formula_fileに値があっても無くてもpathに挿入され、その値をif文で評価する、という作りになっている(と思う。)
unwrap()は関数の結果(Option<T>やResult<T>)からTの値を取り出す処理。
まぁ、これでも不完全の様なんだが、とりあえずここはテキストに従う。