use std::path::{Path, PathBuf};
pub(crate) fn resolve(env: &impl Fn(&str) -> Option<String>) -> PathBuf {
if let Some(home) = env("CODEX_HOME").filter(|value| !value.is_empty()) {
return PathBuf::from(home);
}
env("HOME").filter(|home| !home.is_empty()).map_or_else(
|| PathBuf::from(".codex"),
|home| Path::new(&home).join(".codex"),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn codex_home_wins_when_set() {
let home = resolve(&|key| match key {
"CODEX_HOME" => Some("/somewhere/else".into()),
"HOME" => Some("/home/someone".into()),
_ => None,
});
assert_eq!(home, PathBuf::from("/somewhere/else"));
}
#[test]
fn falls_back_to_the_user_home() {
let home = resolve(&|key| match key {
"HOME" => Some("/home/someone".into()),
_ => None,
});
assert_eq!(home, PathBuf::from("/home/someone/.codex"));
}
#[test]
fn an_empty_codex_home_is_ignored() {
let home = resolve(&|key| match key {
"CODEX_HOME" => Some(String::new()),
"HOME" => Some("/home/someone".into()),
_ => None,
});
assert_eq!(home, PathBuf::from("/home/someone/.codex"));
}
#[test]
fn a_relative_default_when_nothing_is_set() {
assert_eq!(resolve(&|_| None), PathBuf::from(".codex"));
}
}