komichi 2.2.0

Application tools for working with file-system paths
Documentation
use crate::environ::EnvVal;
use crate::local::LocalInfo;
use camino::{Utf8Path, Utf8PathBuf};

pub struct Info {
    home: Utf8PathBuf,
    app_name: String,
}

impl Info {
    pub fn new<T>(
        app_name: &str,
        home: &T,
    ) -> Self
    where
        T: AsRef<Utf8Path> + ?Sized,
    {
        let app_name = app_name.to_owned();
        let home = home.as_ref().to_owned();
        Self { home, app_name }
    }
}

impl LocalInfo for Info {
    fn get_cache_home(&self) -> Utf8PathBuf {
        let default = self.home.join(".cache");
        let out: Utf8PathBuf = EnvVal::from("XDG_CACHE_HOME")
            .with_default_value(&default)
            .into();
        out.join(&self.app_name)
    }
    fn get_config_home(&self) -> Utf8PathBuf {
        let default = self.home.join(".config");
        let out: Utf8PathBuf = EnvVal::from("XDG_CONFIG_HOME")
            .with_default_value(&default)
            .into();
        out.join(&self.app_name)
    }
    fn get_data_home(&self) -> Utf8PathBuf {
        let default = self.home.join(".local").join("share");
        let out: Utf8PathBuf = EnvVal::from("XDG_DATA_HOME")
            .with_default_value(&default)
            .into();
        out.join(&self.app_name)
    }
    fn get_log_home(&self) -> Utf8PathBuf {
        let key =
            format!("{}_LOG_DIR", self.app_name.to_uppercase());
        let default = self.get_state_home().join("log");
        let out: Utf8PathBuf =
            EnvVal::from(&key).with_default_value(&default).into();
        out
    }
    fn get_state_home(&self) -> Utf8PathBuf {
        let default = self.home.join(".local").join("state");
        let out: Utf8PathBuf = EnvVal::from("XDG_STATE_HOME")
            .with_default_value(&default)
            .into();
        out.join(&self.app_name)
    }
}