use std::path::PathBuf;
use anyhow::{Context, Result};
use directories::ProjectDirs;
pub const DATA_DIR_ENV: &str = "MERMAID_DATA_DIR";
pub fn data_dir() -> Result<PathBuf> {
if let Some(dir) = std::env::var_os(DATA_DIR_ENV).filter(|dir| !dir.is_empty()) {
return Ok(PathBuf::from(dir));
}
if let Some(proj_dirs) = ProjectDirs::from("", "", "mermaid") {
return Ok(proj_dirs.data_dir().to_path_buf());
}
let home = std::env::var("HOME")
.or_else(|_| std::env::var("USERPROFILE"))
.context("could not determine home directory")?;
Ok(PathBuf::from(home).join(".local/share/mermaid"))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn data_dir_env_override_wins_and_empty_is_unset() {
let sandbox = std::env::temp_dir().join("mermaid-data-dir-override-test");
temp_env::with_var(
DATA_DIR_ENV,
Some(sandbox.to_str().expect("utf8 temp path")),
|| {
assert_eq!(data_dir().expect("override resolves"), sandbox);
},
);
temp_env::with_var(DATA_DIR_ENV, Some(""), || {
let resolved = data_dir().expect("platform dir resolves");
assert_ne!(resolved, PathBuf::from(""), "empty must not become cwd");
assert!(resolved.is_absolute(), "got {}", resolved.display());
});
}
}