use std::path::PathBuf;
const DATA_CACHED: &str = "data_cached";
const CACHE_BUNDLE_ID: &str = "org.spinorama.sotf";
const CACHE_ENV_VAR: &str = "SOTF_CACHE_DIR";
pub fn cache_root() -> PathBuf {
if let Ok(custom) = std::env::var(CACHE_ENV_VAR)
&& !custom.is_empty()
{
return PathBuf::from(custom);
}
let legacy = PathBuf::from(DATA_CACHED);
if legacy.is_dir() {
return legacy;
}
if let Some(mut base) = dirs::cache_dir() {
base.push(CACHE_BUNDLE_ID);
return base;
}
legacy
}
pub fn data_dir_for(speaker: &str) -> PathBuf {
let mut p = cache_root();
p.push("speakers");
p.push("org.spinorama");
p.push(sanitize_dir_name(speaker));
p
}
pub fn sanitize_dir_name(name: &str) -> String {
let mut out = String::with_capacity(name.len());
for ch in name.chars() {
if ch.is_ascii_alphanumeric() || ch == ' ' || ch == '-' || ch == '_' {
out.push(ch);
} else {
out.push('_');
}
}
out.trim().trim_matches('_').to_string()
}
pub fn measurement_filename(measurement: &str) -> String {
let safe = measurement.replace(['/', '\\'], "-");
format!("{}.json", safe)
}