use std::path::PathBuf;
use etcetera::{BaseStrategy, base_strategy::Xdg};
use thiserror::Error;
const APP_DIR: &str = "openlogi";
#[derive(Debug, Error)]
pub enum PathsError {
#[error("could not resolve a home directory for the current user")]
HomeNotFound,
}
fn xdg() -> Result<Xdg, PathsError> {
Xdg::new().map_err(|_| PathsError::HomeNotFound)
}
pub fn xdg_config_home() -> Result<PathBuf, PathsError> {
Ok(xdg()?.config_dir())
}
pub fn config_dir() -> Result<PathBuf, PathsError> {
Ok(xdg_config_home()?.join(APP_DIR))
}
pub fn config_path() -> Result<PathBuf, PathsError> {
Ok(config_dir()?.join("config.toml"))
}
pub fn data_dir() -> Result<PathBuf, PathsError> {
Ok(xdg()?.data_dir().join(APP_DIR))
}
pub fn runtime_dir() -> Result<PathBuf, PathsError> {
let xdg = xdg()?;
Ok(xdg
.runtime_dir()
.map_or_else(|| xdg.config_dir().join(APP_DIR), |dir| dir.join(APP_DIR)))
}
pub fn agent_socket_path() -> Result<PathBuf, PathsError> {
Ok(runtime_dir()?.join("agent.sock"))
}
#[cfg(all(test, unix))]
#[allow(clippy::expect_used, reason = "expect/unwrap are idiomatic in tests")]
mod tests {
use super::*;
#[test]
fn config_dir_keeps_openlogi_under_xdg_config_home() {
assert!(config_dir().expect("config dir").ends_with("openlogi"));
}
#[test]
fn data_dir_keeps_openlogi_under_xdg_data_home() {
assert!(data_dir().expect("data dir").ends_with("openlogi"));
}
#[test]
fn runtime_dir_keeps_openlogi_suffix() {
assert!(runtime_dir().expect("runtime dir").ends_with("openlogi"));
}
}