app-rummage 1.2.0

Find installed and running applications on Linux
Documentation
use std::sync::OnceLock;

pub(crate) fn path() -> &'static [String] {
    static PATH: OnceLock<Vec<String>> = OnceLock::new();

    PATH.get_or_init(|| {
        let path = std::env::var_os("PATH").unwrap_or_else(|| {
            "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin".into()
        });
        path.to_string_lossy()
            .split(':')
            .map(|c| c.to_string())
            .collect::<Vec<_>>()
    })
    .as_slice()
}

pub(crate) fn home_dir() -> &'static str {
    static HOME_DIR: OnceLock<String> = OnceLock::new();

    HOME_DIR.get_or_init(|| {
        std::env::var("HOME").unwrap_or_else(|e| {
            log::error!("Failed to get HOME: {}. Falling back to `/`", e);
            "/".into()
        })
    })
}

pub(crate) fn xdg_data_dirs() -> &'static [String] {
    static XDG_DATA_DIRS: OnceLock<Vec<String>> = OnceLock::new();

    XDG_DATA_DIRS.get_or_init(|| {
        let xdg_data_home = match std::env::var("XDG_DATA_HOME") {
            Ok(dir) => dir.to_string(),
            Err(e) => {
                log::error!(
                    "Failed to get XDG_DATA_HOME: {e}. Falling back to `$HOME/.local/share`",
                );
                format!("{}/.local/share", home_dir())
            }
        };
        let mut out = vec![xdg_data_home];
        match std::env::var("XDG_DATA_DIRS") {
            Ok(dir) => out.append(&mut dir.split(':').map(String::from).collect()),
            Err(e) => {
                log::error!("Failed to get XDG_DATA_DIRS: {e}. Falling back to `/usr/share`");
                out.push("/usr/share".into())
            }
        };
        out
    })
}