RustでPathの拡張子に応じて処理を変える
今回は、RustでPathの拡張子を解析し、その拡張子に応じて処理を変える方法を調査してた際の備忘録です。
例えば、パスがあり、その拡張子に応じて出力するメッセージを変えたいとします。
.txt
ならtext file
と表示し、bmp
ならbitmap file
と表示する、みたいな感じです。
ちょっと上手くいかなくてWebで情報を調べてみたら、とても良い所がありました。
上のサイトを参考に書いてみたのが下記です。
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); }
こうすることで、拡張子に応じて処理を変えることが出来そうです。