file_sorter-cli 0.1.1

Simple Rust CLI tool to organize downloads by file type
use std::fs;
use std::env;

fn main() -> std::io::Result<()> {

    let downloads = dirs::download_dir().unwrap();

    let folder = env::args().nth(1).map(std::path::PathBuf::from).unwrap_or(downloads);

    let paths = fs::read_dir(&folder)?;

    let pdf_dir = folder.join("PDFs");
    let img_dir = folder.join("IMGs");
    let audio_dir = folder.join("AUDIOs");
    let archive_dir = folder.join("ARCHIVEs");
    
    fs::create_dir_all(&pdf_dir)?;
    fs::create_dir_all(&img_dir)?;
    fs::create_dir_all(&audio_dir)?;
    fs::create_dir_all(&archive_dir)?;
    
    for entry in paths {
        let path = entry.unwrap().path();
        let file_name = path.file_name().unwrap().to_string_lossy();
        let images = ["jpg", "png", "webp", "gif", "avif", "tiff", "bmp", "raw", "heif", "heic"];
        let docs = ["docx", "pdf", "doc", "odt", "txt", "rtf", "xps", "xlsx", "csv", "ods"];
        let audio = ["mp3", "mp4", "mp5", "wav", "aac", "flac", "ogg", "wma", "aiff", "m4a", "dts", "opus"];
        let archive = ["zip", "tar", "gz", "bz2", "7z", "rar", "xz", "lzh", "lha", "taz", "pkg", "deb", "tgz", "lzip"];

        if let Some(ext) = path.extension() {
            let ext = ext.to_string_lossy().to_lowercase();
            
            if docs.contains(&ext.as_str()) {
                    let dest = pdf_dir.join(file_name.as_ref());
                    fs::rename(&path, &dest)?;
                }
            else if images.contains(&ext.as_str()) {
                    let dest = img_dir.join(file_name.as_ref());            
                    fs::rename(&path, &dest)?;
                }     
            else if audio.contains(&ext.as_str()) {
                    let dest = audio_dir.join(file_name.as_ref());                 
                    fs::rename(&path, &dest)?;
                }
            else if archive.contains(&ext.as_str()) {
                    let dest = archive_dir.join(file_name.as_ref());                 
                    fs::rename(&path, &dest)?;
                }    
        }
    }
    Ok(())
}