use std::path::{Path, PathBuf};
use anyhow::{Context, Result};
use directories::ProjectDirs;
#[derive(Clone)]
pub struct Paths {
config_dir: PathBuf,
data_dir: PathBuf,
}
impl Paths {
pub fn discover() -> Result<Self> {
let dirs = ProjectDirs::from("", "", "review-queue")
.context("could not determine home directory")?;
Ok(Self {
config_dir: dirs.config_dir().to_path_buf(),
data_dir: dirs.data_dir().to_path_buf(),
})
}
pub fn with_overrides(mut self, data_dir: Option<PathBuf>) -> Self {
if let Some(d) = data_dir {
self.data_dir = d;
}
self
}
pub fn config_file(&self) -> PathBuf {
self.config_dir.join("config.toml")
}
pub fn state_file(&self) -> PathBuf {
self.data_dir.join("state.json")
}
pub fn repos_file(&self) -> PathBuf {
self.data_dir.join("repos.json")
}
pub fn sync_lock_file(&self) -> PathBuf {
self.data_dir.join("sync.lock")
}
pub fn workdir_cache_file(&self) -> PathBuf {
self.data_dir.join("workdir.json")
}
pub fn repos_dir(&self) -> PathBuf {
self.data_dir.join("repos")
}
pub fn repo_dir(&self, name: &str) -> PathBuf {
self.repos_dir().join(name)
}
pub fn workspaces_dir(&self) -> PathBuf {
self.data_dir.join("workspaces")
}
pub fn workspace_dir(&self, slug: &str) -> PathBuf {
self.workspaces_dir().join(slug)
}
pub fn data_dir(&self) -> &Path {
&self.data_dir
}
pub fn ensure_dirs(&self) -> Result<()> {
std::fs::create_dir_all(&self.data_dir)
.with_context(|| format!("creating data dir {}", self.data_dir.display()))?;
std::fs::create_dir_all(&self.config_dir)
.with_context(|| format!("creating config dir {}", self.config_dir.display()))?;
Ok(())
}
}