use std::path::PathBuf;
use anyhow::{Context, Result};
pub const ENV_CONFIG_DIR: &str = "PMPX_CONFIG_DIR";
pub const ENV_DATA_DIR: &str = "PMPX_DATA_DIR";
pub fn global_config_path() -> Result<PathBuf> {
if let Some(dir) = std::env::var_os(ENV_CONFIG_DIR) {
return Ok(PathBuf::from(dir).join("config.toml"));
}
let dirs = directories::ProjectDirs::from("", "", "pmpx")
.context("cannot get the config directory (neither HOME nor APPDATA set?)")?;
Ok(dirs.config_dir().join("config.toml"))
}
pub fn default_data_dir() -> Result<PathBuf> {
if let Some(dir) = std::env::var_os(ENV_DATA_DIR) {
return Ok(PathBuf::from(dir));
}
let dirs = directories::UserDirs::new()
.context("cannot get the user directory (HOME / USERPROFILE both unset?)")?;
Ok(dirs.home_dir().join(".pmpx"))
}
pub fn expand_tilde(raw: &str) -> PathBuf {
let rest = raw
.strip_prefix("~/")
.or_else(|| raw.strip_prefix("~\\"))
.or_else(|| if raw == "~" { Some("") } else { None });
match rest {
Some(rest) => match directories::UserDirs::new() {
Some(dirs) => dirs.home_dir().join(rest),
None => PathBuf::from(raw),
},
None => PathBuf::from(raw),
}
}