use directories::{BaseDirs, ProjectDirs, UserDirs};
use crate::error::Error;
use crate::logging::LoggingSetupBuilder;
#[derive(Default)]
pub struct CrateSetupBuilder {
qualifier: Option<String>,
company_name: Option<String>,
application_name: Option<String>,
}
pub struct CrateSetup {
application_name: String,
base_dirs: BaseDirs,
user_dirs: UserDirs,
project_dirs: ProjectDirs,
}
impl CrateSetupBuilder {
pub fn new() -> Self {
Self::default()
}
pub fn with_app_name(mut self, application_name: impl AsRef<str>) -> Self {
self.application_name = Some(application_name.as_ref().to_string());
self
}
pub fn with_full_app_name(
mut self,
qualifier: impl AsRef<str>,
company_name: impl AsRef<str>,
application_name: impl AsRef<str>,
) -> Self {
self.qualifier = Some(qualifier.as_ref().to_string());
self.company_name = Some(company_name.as_ref().to_string());
self.application_name = Some(application_name.as_ref().to_string());
self
}
pub fn build(self) -> Result<CrateSetup, Error> {
let application_name = self
.application_name
.unwrap_or_else(|| env!("CARGO_PKG_NAME").to_string());
let base_dirs = BaseDirs::new().ok_or(Error::DirectoryBuildError)?;
let user_dirs = UserDirs::new().ok_or(Error::DirectoryBuildError)?;
let project_dirs = match (self.qualifier, self.company_name) {
(Some(qualifier), Some(company_name)) => {
ProjectDirs::from(&qualifier, &company_name, &application_name)
}
_ => ProjectDirs::from("", "", &application_name),
}
.ok_or(Error::DirectoryBuildError)?;
Ok(CrateSetup {
application_name,
base_dirs,
user_dirs,
project_dirs,
})
}
}
impl CrateSetup {
pub fn application_name(&self) -> &str {
&self.application_name
}
pub fn base_dirs(&self) -> &BaseDirs {
&self.base_dirs
}
pub fn user_dirs(&self) -> &UserDirs {
&self.user_dirs
}
pub fn project_dirs(&self) -> &ProjectDirs {
&self.project_dirs
}
pub fn logging_setup(&self) -> LoggingSetupBuilder {
LoggingSetupBuilder::new(self)
}
}