use std::path::{Path, PathBuf};
fn resolve_home(
oxicode_home: Option<&str>,
oxi_home: Option<&Path>,
user_home: Option<&Path>,
) -> Option<PathBuf> {
if let Some(p) = crate::oxi_home::resolve_oxicode_home(oxicode_home, oxi_home) {
return Some(p);
}
crate::oxi_home::resolve_oxi_home(None, user_home).map(|h| h.join("oxicode"))
}
pub fn home_dir() -> std::io::Result<PathBuf> {
let oxi = crate::oxi_home::oxi_home();
resolve_home(
std::env::var("OXICODE_HOME").ok().as_deref(),
oxi.as_deref(),
dirs::home_dir().as_deref(),
)
.ok_or_else(|| {
std::io::Error::new(
std::io::ErrorKind::NotFound,
"neither OXICODE_HOME nor OXI_HOME nor HOME is set",
)
})
}
pub fn catalog_override_dir() -> Option<PathBuf> {
home_dir().ok().map(|h| h.join("catalog"))
}
pub fn cache_dir() -> Option<PathBuf> {
home_dir().ok().map(|h| h.join("cache"))
}
pub fn auth_path() -> Option<PathBuf> {
home_dir().ok().map(|h| h.join("auth.json"))
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn oxicode_home_wins_when_set() {
let got = resolve_home(
Some("/custom/oxios"),
Some(Path::new("/home/u/.oxi")),
Some(Path::new("/home/u")),
);
assert_eq!(got, Some(PathBuf::from("/custom/oxios")));
}
#[test]
fn empty_oxicode_home_falls_through() {
let got = resolve_home(
Some(""),
Some(Path::new("/home/u/.oxi")),
Some(Path::new("/home/u")),
);
assert_eq!(got, Some(PathBuf::from("/home/u/.oxi/oxicode")));
}
#[test]
fn defaults_to_oxi_home_oxicode() {
let got = resolve_home(
None,
Some(Path::new("/home/u/.oxi")),
Some(Path::new("/home/u")),
);
assert_eq!(got, Some(PathBuf::from("/home/u/.oxi/oxicode")));
}
#[test]
fn falls_back_to_user_home_when_oxi_home_absent() {
let got = resolve_home(None, None, Some(Path::new("/home/u")));
assert_eq!(got, Some(PathBuf::from("/home/u/.oxi/oxicode")));
}
#[test]
fn none_when_all_absent() {
assert_eq!(resolve_home(None, None, None), None);
}
#[test]
fn subpaths_compose_from_resolved_home() {
let home = resolve_home(Some("/x"), None, None).unwrap();
assert_eq!(
home.join("catalog").join("overrides.toml"),
PathBuf::from("/x/catalog/overrides.toml")
);
assert_eq!(
home.join("cache").join("models-dev.json"),
PathBuf::from("/x/cache/models-dev.json")
);
assert_eq!(home.join("auth.json"), PathBuf::from("/x/auth.json"));
}
#[test]
fn home_dir_resolves_in_ci() {
let resolved = home_dir();
assert!(resolved.is_ok(), "expected a resolvable home dir");
}
}