find-dl 0.2.0

Simple tool to get the last downloaded file(s)
Documentation
use std::{cmp::Reverse, env::VarError, path::PathBuf, time::SystemTime};

use color_eyre::eyre::{OptionExt, Result, WrapErr};

fn find_recent_downloads(dl_dir: PathBuf) -> color_eyre::Result<Vec<(SystemTime, PathBuf)>> {
    let mut downloads: Vec<(SystemTime, PathBuf)> = Vec::new();

    for i in std::fs::read_dir(dl_dir)? {
        let i = i?;
        let Ok(meta) = i.metadata() else {
            eprintln!(
                "couldn't read file metadata of {}; skipping",
                i.path().display()
            );
            continue;
        };

        if meta.is_file() {
            let Ok(created) = meta.created() else {
                eprintln!(
                    "couldn't read creation time of {}; skipping",
                    i.path().display()
                );
                continue;
            };

            downloads.push((created, i.path()))
        }
    }

    downloads.sort_by_key(|i| Reverse(i.0));

    Ok(downloads)
}

pub fn find_downloads_dir(home: PathBuf) -> color_eyre::Result<PathBuf> {
    let mut fallback_dl_dir = home.join("Downloads");
    if !fallback_dl_dir.exists() {
        fallback_dl_dir = home.join("dl");
    }
    let dl_dir = match std::env::var("XDG_DOWNLOAD_DIR") {
        Ok(i) => PathBuf::from(i),
        Err(VarError::NotPresent) => fallback_dl_dir,
        Err(e) => {
            return Err(e.into());
        }
    };
    Ok(dl_dir)
}

pub fn recent_downloads() -> Result<Vec<PathBuf>> {
    let home = home::home_dir().ok_or_eyre("find home directory")?;
    let dl_dir = find_downloads_dir(home).wrap_err("find downloads directory")?;
    let recent_downloads = find_recent_downloads(dl_dir).wrap_err("find recent downloads")?;

    Ok(recent_downloads.into_iter().map(|i| i.1).collect())
}