use crate::error::WefterErr;
use anyhow::Result;
use directories::ProjectDirs;
use std::{env, fs, path::PathBuf};
const APP_QUALIFIER: &str = env!("WEFTER_PRJ_QUALIFIER");
const APP_ORGANIZATION: &str = env!("WEFTER_PRJ_ORG");
const APP_NAME: &str = env!("WEFTER_PRJ_NAME");
#[derive(Debug)]
pub struct DirCfg {
pub root: PathBuf,
pub cfg: PathBuf,
pub data: PathBuf,
pub local: Option<PathBuf>,
}
impl DirCfg {
pub fn new() -> Result<Self> {
let prjdir = ProjectDirs::from(APP_QUALIFIER, APP_ORGANIZATION, APP_NAME)
.ok_or(WefterErr::FilesystemError)?;
Ok(Self {
root: std::env::current_dir()?,
cfg: prjdir.config_local_dir().to_path_buf(),
data: prjdir.data_local_dir().to_path_buf(),
local: None,
})
}
pub fn create_if_not_exist(&self) -> Result<()> {
if !self.cfg.is_dir() {
fs::create_dir_all(&self.cfg)?;
log::debug!("Created directory: {:?}", &self.cfg);
}
if !self.data.is_dir() {
fs::create_dir_all(&self.data)?;
log::debug!("Created directory: {:?}", &self.data);
}
Ok(())
}
pub fn update_working_dir(&mut self, newdir: PathBuf) -> Result<()> {
if !newdir.is_dir() {
return Err(WefterErr::BadRootDirectory(newdir).into());
}
env::set_current_dir(&newdir)?;
self.root = newdir;
Ok(())
}
pub fn update_data_dir(&mut self, newdir: PathBuf) -> Result<()> {
if !newdir.is_dir() {
return Err(WefterErr::NoSuchResourceDirectory(newdir).into());
}
self.data = newdir;
Ok(())
}
pub fn update_local_dir(&mut self, newdir: PathBuf) -> Result<()> {
if newdir.is_dir() {
self.local = Some(newdir);
return Ok(());
}
let mut wd = self.root.clone();
wd.push(newdir);
if wd.is_dir() {
self.local = Some(wd);
return Ok(());
}
Err(WefterErr::NoSuchResourceDirectory(wd).into())
}
}