開発

[rust] clap v4で書き換えてみる

空き時間ができたので久しぶりにrustの勉強です。

文法など少し忘れているので以前に書いたコードをいじってみました。

コマンドラインのオプション処理に使用していたclapがバージョンアップと共に以前のコードでは動かなくなっていたので書き直してみました。

どうやらメジャーバージョンアップ毎に書き方が変化しているようです。rustのDeriveによりシンプルな書き方に変わっているのでしょう。

一応以前のBuilderタイプも使用できるようです。おそらく今後はサポートされない方向性だと思います。

Deriveタイプで書き直してみました。以前のclap v2よりすっきりしましたね。

use anyhow::Result; // 1.0.71
use clap::Parser; // 4.3.11
use std::fs;

#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// target directory
    #[arg(short, long, default_value_t = String::from(".") )]
    dir: String,
}

fn main() -> Result<()> {
    let args = Args::parse();

    let dir_string = args.dir.to_string();
    println!("{}", dir_string);
    let _ = get_dirs(dir_string);

    Ok(())
}

fn get_dirs(dir: String) -> Result<()> {
    let mut entries = fs::read_dir(dir)?;

    while let Some(entry) = entries.next() {
        let entry = entry?;
        let metadata = entry.metadata()?;
        let path = entry.path();

        if metadata.is_dir() {
            let path = path.display().to_string();
            println!("{}", path);
            let _ = get_dirs(path);

            continue;
        }

        if let Ok(symlink) = fs::read_link(&path) {
            if path.is_dir() {
                println!("{}@ -> {}", path.display(), symlink.display());
            }
        }
    }

    Ok(())
}
Tags: rust
管理人

Recent Posts

[rust] GUI crateを調査

Rustはたまに触る程度で継続的にプログ…

2日 ago

CanvaがSerif (Affinity) を買収

私は使ったことがないのですが名前はよく聞…

1か月 ago

Serifのスプリングセール – アドオンが50%オフ

Affinity Photoなどレタッチ…

2か月 ago

音声がロボットのようになるときの対処

リモート会議などでたまに相手の音声がおか…

3か月 ago

Serifのブラックフライデー – 全品40%オフ V1ユーザは更にお得!

恒例のブラックフライデーセールが始まりま…

6か月 ago

[rust] rayonで書き直してみました

前回のコードを元にrayonを使った処理…

6か月 ago