use std::path::PathBuf;
pub fn data_dir() -> PathBuf {
if let Ok(env) = std::env::var("ROVER_DATA_DIR")
&& !env.is_empty()
{
return PathBuf::from(env);
}
dirs::data_local_dir()
.map(|p| p.join("rover"))
.unwrap_or_else(|| PathBuf::from("./.rover"))
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::Mutex;
static ENV_LOCK: Mutex<()> = Mutex::new(());
#[test]
fn env_var_wins_over_platform_default() {
let _g = ENV_LOCK.lock().unwrap();
unsafe { std::env::set_var("ROVER_DATA_DIR", "/tmp/rover-test-data") };
let p = data_dir();
unsafe { std::env::remove_var("ROVER_DATA_DIR") };
assert_eq!(p, PathBuf::from("/tmp/rover-test-data"));
}
#[test]
fn empty_env_var_falls_through() {
let _g = ENV_LOCK.lock().unwrap();
unsafe { std::env::set_var("ROVER_DATA_DIR", "") };
let p = data_dir();
unsafe { std::env::remove_var("ROVER_DATA_DIR") };
assert!(p.ends_with("rover") || p.to_string_lossy().contains(".rover"));
}
#[test]
fn unset_env_falls_through_to_platform_default() {
let _g = ENV_LOCK.lock().unwrap();
unsafe { std::env::remove_var("ROVER_DATA_DIR") };
let p = data_dir();
assert!(p.ends_with("rover"));
}
}