use std::path::PathBuf;
use crate::error::ServerError;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum HomeSource {
Explicit,
Derived,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct AionHome {
pub path: PathBuf,
pub source: HomeSource,
}
pub fn aion_home() -> Result<AionHome, ServerError> {
let configured = std::env::var_os("AION_HOME");
let (path, source) = match configured {
Some(value) if value.is_empty() => {
return Err(ServerError::Config {
message: "AION_HOME must not be empty".to_owned(),
});
}
Some(value) => (PathBuf::from(value), HomeSource::Explicit),
None => {
let Some(home) = std::env::var_os("HOME").filter(|value| !value.is_empty()) else {
return Err(ServerError::Config {
message: "cannot resolve Aion home: set AION_HOME or HOME".to_owned(),
});
};
(PathBuf::from(home).join(".aion"), HomeSource::Derived)
}
};
let path = if path.is_absolute() {
path
} else {
std::env::current_dir()
.map(|current| current.join(path))
.map_err(|source| ServerError::Config {
message: format!(
"cannot resolve relative AION_HOME against the current directory: {source}"
),
})?
};
Ok(AionHome { path, source })
}