use std::path::PathBuf;
use directories::ProjectDirs;
pub struct FondPaths {
pub data_dir: PathBuf,
pub config_dir: PathBuf,
}
impl FondPaths {
pub fn resolve(data_dir_override: Option<PathBuf>) -> Self {
if let Some(dir) = data_dir_override {
return Self {
config_dir: dir.join("config"),
data_dir: dir,
};
}
if let Some(proj) = ProjectDirs::from("com", "kafkade", "fond") {
Self {
data_dir: proj.data_dir().to_path_buf(),
config_dir: proj.config_dir().to_path_buf(),
}
} else {
let home = dirs_fallback();
Self {
data_dir: home.join("data"),
config_dir: home.join("config"),
}
}
}
pub fn ensure_dirs(&self) -> std::io::Result<()> {
std::fs::create_dir_all(&self.data_dir)?;
std::fs::create_dir_all(self.data_dir.join("recipes"))?;
std::fs::create_dir_all(&self.config_dir)?;
Ok(())
}
}
fn dirs_fallback() -> PathBuf {
#[allow(deprecated)]
std::env::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(".fond")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resolve_with_override() {
let tmp = std::env::temp_dir().join("fond-test-paths");
let paths = FondPaths::resolve(Some(tmp.clone()));
assert_eq!(paths.data_dir, tmp);
assert_eq!(paths.config_dir, tmp.join("config"));
}
#[test]
fn resolve_default_returns_valid_paths() {
let paths = FondPaths::resolve(None);
assert!(!paths.data_dir.as_os_str().is_empty());
assert!(!paths.config_dir.as_os_str().is_empty());
}
}