Closed6
RustでCLIツールを作る
クレート追加
# 必要に応じて
$ cargo install cargo-edit
# これを追加する
$ cargo add clap
オプションで引数を受け取る
オプション指定されればその値を使い、それ以外は乱数を使う。
use clap::{App, Arg};
fn main() {
let matches = App::new("article creator")
.version("0.0.1")
.author("tminasen")
.about("article utility tools")
.arg(Arg::with_name("file-name")
.short("f")
.long("file")
.value_name("FILE_NAME")
.help("specify file name")
.required(false)
)
.get_matches();
let file_name = match matches.value_of("file-name") {
Some(name) => name.to_string(),
None => {
let mut rng = thread_rng();
let rand_string: String = iter::repeat(()).map(|()| rng.sample(Alphanumeric)).take(20).collect();
rand_string.to_lowercase()
}
};
println!("file_name is {}", file_name);
}
オプションが指定されていることを確認する
fn main() {
let matches = App::new("article creator")
.version("0.0.1")
.author("tminasen")
.about("article utility tools")
.arg(Arg::with_name("version")
.short("v")
.long("version")
.help("check tool version")
.required(false)
)
.get_matches();
let version = matches.is_present("version");
println!("version is {}", version);
}
1つのオプションで複数の引数受け付ける
fn main() {
let matches = App::new("article creator")
.version("0.0.1")
.author("tminasen")
.about("article utility tools")
.arg(Arg::with_name("rename")
.long("rename")
.value_name("OLD_FILE_NAME")
.value_name("NEW_FILE_NAME")
.help("rename files")
// 値受け取る
.takes_value(true)
// 複数受け取るよ
.multiple(true)
.required(false)
)
.get_matches();
// フォーマット変更
if matches.is_present("rename") {
let arguments: Vec<&str> = matches.values_of("rename").unwrap().collect();
println!("rename arguments[0] is {}", arguments[0]);
println!("rename arguments[1] is {}", arguments[1]);
return;
}
}
特定ディレクトリ配下のファイル取得
let files = fs::read_dir("dir_name/")?
.filter_map(|entry| {
let entry = entry.ok()?;
if entry.file_type().ok()?.is_file() {
Some(entry.file_name().to_string_lossy().into_owned())
} else {
None
}
})
.collect();
特定ディレクトリ配下のファイルをリネーム
let mut index = 1;
fs::read_dir(format!("src/md-pages/{}/images", dir_name))?
.filter_map(|entry| {
let entry = entry.ok()?;
if entry.file_type().ok()?.is_file() {
Some(entry.file_name().to_string_lossy().into_owned())
} else {
None
}
})
.for_each(move |file| {
let before_filename = format!("dir_name/{}", file);
let after_filename = format!("dir_name/sample-{}.txt", index);
fs::rename(before_filename, after_filename);
index += 1;
});
このスクラップは2020/12/07にクローズされました