use std::path::PathBuf;
use std::sync::RwLock;
use nils_common::env as common_env;
pub const PLAN_ISSUE_STATE_HOME_ENV: &str = "PLAN_ISSUE_HOME";
static CLI_OVERRIDE: RwLock<Option<PathBuf>> = RwLock::new(None);
pub fn set_state_dir_override(value: Option<PathBuf>) {
let mut guard = CLI_OVERRIDE
.write()
.expect("plan-issue state-dir override write lock");
*guard = value;
}
pub fn state_dir() -> PathBuf {
if let Some(path) = CLI_OVERRIDE
.read()
.expect("plan-issue state-dir override read lock")
.clone()
{
return path;
}
if let Some(value) = common_env::env_non_empty(PLAN_ISSUE_STATE_HOME_ENV) {
return PathBuf::from(value);
}
xdg_default()
}
fn xdg_default() -> PathBuf {
if let Some(value) = common_env::env_non_empty("XDG_STATE_HOME") {
return PathBuf::from(value).join("plan-issue");
}
let home = std::env::var_os("HOME")
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("/"));
home.join(".local").join("state").join("plan-issue")
}
#[cfg(test)]
mod tests {
use super::*;
use nils_test_support::{EnvGuard, GlobalStateLock};
fn reset() {
set_state_dir_override(None);
}
#[test]
fn cli_override_wins_over_env_and_xdg() {
let lock = GlobalStateLock::new();
let _env = EnvGuard::set(&lock, "PLAN_ISSUE_HOME", "/tmp/plan-issue-env");
let _xdg = EnvGuard::set(&lock, "XDG_STATE_HOME", "/tmp/xdg");
set_state_dir_override(Some(PathBuf::from("/tmp/cli-override")));
let resolved = state_dir();
reset();
assert_eq!(resolved, PathBuf::from("/tmp/cli-override"));
}
#[test]
fn env_used_when_override_unset() {
let lock = GlobalStateLock::new();
reset();
let _env = EnvGuard::set(&lock, "PLAN_ISSUE_HOME", "/tmp/plan-issue-env");
let _xdg = EnvGuard::set(&lock, "XDG_STATE_HOME", "/tmp/xdg");
let resolved = state_dir();
assert_eq!(resolved, PathBuf::from("/tmp/plan-issue-env"));
}
#[test]
fn xdg_default_when_neither_override_nor_env_set() {
let lock = GlobalStateLock::new();
reset();
let _env = EnvGuard::remove(&lock, "PLAN_ISSUE_HOME");
let _xdg = EnvGuard::set(&lock, "XDG_STATE_HOME", "/tmp/xdg");
let resolved = state_dir();
assert_eq!(resolved, PathBuf::from("/tmp/xdg/plan-issue"));
}
}