use camino::Utf8Path;
use crate::{
local::LocalDirs, service::ServiceDirs, simple::SimpleBuilder, user::UserDirs, Directories,
};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum UnifiedDirs {
Local(LocalDirs),
Service(ServiceDirs),
User(UserDirs),
}
impl UnifiedDirs {
pub fn local() -> Option<Self> {
LocalDirs::new().map(Self::Local)
}
pub fn local_at(base: impl AsRef<Utf8Path>) -> Self {
Self::Local(LocalDirs::new_at(base))
}
#[must_use]
pub fn service(organization: impl AsRef<str>, application: impl AsRef<str>) -> Self {
Self::Service(ServiceDirs::new(organization, application))
}
pub fn user(
qualifier: impl AsRef<str>,
organization: impl AsRef<str>,
application: impl AsRef<str>,
) -> Option<Self> {
UserDirs::new(qualifier, organization, application).map(Self::User)
}
#[must_use]
pub fn simple<Q, O, A>(qualifier: Q, organization: O, application: A) -> SimpleBuilder<Q, O, A>
where
Q: AsRef<str>,
O: AsRef<str>,
A: AsRef<str>,
{
SimpleBuilder::new(qualifier, organization, application)
}
}
impl Directories for UnifiedDirs {
fn cache_dir(&self) -> &Utf8Path {
match self {
Self::Local(dirs) => dirs.cache_dir(),
Self::Service(dirs) => dirs.cache_dir(),
Self::User(dirs) => dirs.cache_dir(),
}
}
fn config_dir(&self) -> &Utf8Path {
match self {
Self::Local(dirs) => dirs.config_dir(),
Self::Service(dirs) => dirs.config_dir(),
Self::User(dirs) => dirs.config_dir(),
}
}
fn data_dir(&self) -> &Utf8Path {
match self {
Self::Local(dirs) => dirs.data_dir(),
Self::Service(dirs) => dirs.data_dir(),
Self::User(dirs) => dirs.data_dir(),
}
}
}