use std::env;
use crate::unified::UnifiedDirs;
pub struct SimpleBuilder<Q, O, A> {
service: bool,
qualifier: Q,
organization: O,
application: A,
}
impl<Q, O, A> SimpleBuilder<Q, O, A>
where
Q: AsRef<str>,
O: AsRef<str>,
A: AsRef<str>,
{
pub(crate) fn new(qualifier: Q, organization: O, application: A) -> Self {
Self {
service: false,
qualifier,
organization,
application,
}
}
#[must_use]
pub fn with_env(self) -> Self {
self.with(|_| env::vars_os().any(|(name, _)| name == "SERVICE" || name == "DAEMON"))
}
#[must_use]
pub fn with_args(self) -> Self {
self.with(|_| env::args_os().any(|name| name == "--service" || name == "--daemon"))
}
#[must_use]
pub fn with_username(self) -> Self {
self.with(|builder| whoami::username_os() == builder.application.as_ref())
}
#[must_use]
pub fn with(self, f: impl FnOnce(&Self) -> bool) -> Self {
Self {
service: self.service || f(&self),
qualifier: self.qualifier,
organization: self.organization,
application: self.application,
}
}
#[must_use]
pub fn build(self) -> Option<UnifiedDirs> {
fn inner(
service: bool,
qualifier: &str,
organization: &str,
application: &str,
) -> Option<UnifiedDirs> {
if cfg!(debug_assertions) {
UnifiedDirs::local()
} else if service {
Some(UnifiedDirs::service(organization, application))
} else {
UnifiedDirs::user(qualifier, organization, application)
}
}
inner(
self.service,
self.qualifier.as_ref(),
self.organization.as_ref(),
self.application.as_ref(),
)
}
pub fn default(self) -> Option<UnifiedDirs> {
self.with_env().with_args().with_username().build()
}
}