use std::fs;
use std::path::{Path, PathBuf};
use anyhow::{Context, Result};
pub(crate) struct DirPath {
bin_dir: PathBuf,
config_file: PathBuf,
git_dir: PathBuf,
checkout_dir: PathBuf,
db_dir: PathBuf,
registry_dir: PathBuf,
cache_dir: PathBuf,
index_dir: PathBuf,
src_dir: PathBuf,
}
impl DirPath {
pub(crate) fn new() -> Result<Self> {
let config_dir = dirs_next::config_dir().context("Cannot get config directory location")?;
if !config_dir.exists() {
fs::create_dir_all(&config_dir).context("Failed to create config dir")?;
}
let config_file = config_dir.join("cargo_trim_config.toml");
if !config_file.exists() {
fs::File::create(&config_file).context("Failed to create config file")?;
}
let home_dir = Path::new(env!("CARGO_HOME")).to_path_buf();
let bin_dir = home_dir.join("bin");
let git_dir = home_dir.join("git");
let checkout_dir = git_dir.join("checkouts");
let db_dir = git_dir.join("db");
let registry_dir = home_dir.join("registry");
let cache_dir = registry_dir.join("cache");
let src_dir = registry_dir.join("src");
let index_dir = registry_dir.join("index");
Ok(Self {
bin_dir,
config_file,
git_dir,
checkout_dir,
db_dir,
registry_dir,
cache_dir,
index_dir,
src_dir,
})
}
pub(crate) fn bin_dir(&self) -> &PathBuf {
&self.bin_dir
}
pub(crate) fn config_file(&self) -> &PathBuf {
&self.config_file
}
pub(crate) fn git_dir(&self) -> &PathBuf {
&self.git_dir
}
pub(crate) fn checkout_dir(&self) -> &PathBuf {
&self.checkout_dir
}
pub(crate) fn db_dir(&self) -> &PathBuf {
&self.db_dir
}
pub(crate) fn registry_dir(&self) -> &PathBuf {
&self.registry_dir
}
pub(crate) fn cache_dir(&self) -> &PathBuf {
&self.cache_dir
}
pub(crate) fn index_dir(&self) -> &PathBuf {
&self.index_dir
}
pub(crate) fn src_dir(&self) -> &PathBuf {
&self.src_dir
}
}