RustでPathの拡張子に応じて処理を変える

今回は、RustでPathの拡張子を解析し、その拡張子に応じて処理を変える方法を調査してた際の備忘録です。

例えば、パスがあり、その拡張子に応じて出力するメッセージを変えたいとします。 .txt ならtext fileと表示し、bmpならbitmap fileと表示する、みたいな感じです。

ちょっと上手くいかなくてWebで情報を調べてみたら、とても良い所がありました。

stackoverflow.com

上のサイトを参考に書いてみたのが下記です。

fn main() {
    let file_path = std::path::Path::new("./temp.txt");
    eprintln!("Debug: file_path: {:?}", file_path);
    eprintln!("Debug: file_path.extension(): {:?}", file_path.extension());
    
    let file_type = match file_path.extension() {
        None => "no extension",
        Some(f) => match f.to_str() {
            Some("txt") => ", text file",
            Some("bmp") => ", bitmap file",
            _ => ", not text, not bitmap",
        },
    };
    println!("This file is {}", file_type);
}

他にはand_thenコンビネータを使って以下のようにも書くことができます。

fn main() {
    let file_path = std::path::Path::new("./temp.txt");
    eprintln!("Debug: file_path: {:?}", file_path);
    eprintln!("Debug: file_path.extension(): {:?}", file_path.extension());
    
    let file_type = match file_path.extension().and_then(std::ffi::OsStr::to_str) {
        None => "no extension",
        Some("txt") => ", text file",
        Some("bmp") => ", bitmap file",
        _ => ", not text, not bitmap",
    };
    println!("This file is {}", file_type);
}

こうすることで、拡張子に応じて処理を変えることが出来そうです。