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にクローズされました