lean_ctx/core/
data_dir.rs1use std::path::PathBuf;
2
3pub fn lean_ctx_data_dir() -> Result<PathBuf, String> {
10 if let Ok(dir) = std::env::var("LEAN_CTX_DATA_DIR") {
11 let trimmed = dir.trim();
12 if !trimmed.is_empty() {
13 let p = PathBuf::from(trimmed);
14 ensure_dir_permissions(&p);
15 return Ok(p);
16 }
17 }
18
19 let home = dirs::home_dir().ok_or_else(|| "Cannot determine home directory".to_string())?;
20
21 let legacy = home.join(".lean-ctx");
22 if legacy.exists() {
23 ensure_dir_permissions(&legacy);
24 return Ok(legacy);
25 }
26
27 let xdg_config = std::env::var("XDG_CONFIG_HOME")
28 .ok()
29 .filter(|s| !s.trim().is_empty())
30 .map_or_else(|| home.join(".config"), PathBuf::from);
31
32 let dir = xdg_config.join("lean-ctx");
33 ensure_dir_permissions(&dir);
34 Ok(dir)
35}
36
37#[cfg(unix)]
38fn ensure_dir_permissions(path: &std::path::Path) {
39 use std::os::unix::fs::PermissionsExt;
40 if path.is_dir() {
41 let _ = std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o700));
42 }
43}
44
45#[cfg(not(unix))]
46fn ensure_dir_permissions(_path: &std::path::Path) {}
47
48pub fn test_env_lock() -> std::sync::MutexGuard<'static, ()> {
49 use std::sync::{Mutex, OnceLock};
50 static LOCK: OnceLock<Mutex<()>> = OnceLock::new();
51 let mutex = LOCK.get_or_init(|| Mutex::new(()));
52 mutex
53 .lock()
54 .unwrap_or_else(std::sync::PoisonError::into_inner)
55}