use camino::{Utf8Path, Utf8PathBuf};
use crate::Directories;
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct UserDirs {
cache_dir: Utf8PathBuf,
config_dir: Utf8PathBuf,
data_dir: Utf8PathBuf,
}
impl UserDirs {
pub fn new(
qualifier: impl AsRef<str>,
organization: impl AsRef<str>,
application: impl AsRef<str>,
) -> Option<Self> {
fn inner(qualifier: &str, organization: &str, application: &str) -> Option<UserDirs> {
directories::ProjectDirs::from(qualifier, organization, application)
.and_then(|dirs| UserDirs::from_project_dirs(&dirs).ok())
}
inner(
qualifier.as_ref(),
organization.as_ref(),
application.as_ref(),
)
}
fn from_project_dirs(value: &directories::ProjectDirs) -> Result<Self, camino::FromPathError> {
Ok(Self {
cache_dir: <&Utf8Path>::try_from(value.cache_dir())?.to_owned(),
config_dir: <&Utf8Path>::try_from(value.config_dir())?.to_owned(),
data_dir: <&Utf8Path>::try_from(value.data_dir())?.to_owned(),
})
}
}
impl Directories for UserDirs {
fn cache_dir(&self) -> &Utf8Path {
&self.cache_dir
}
fn config_dir(&self) -> &Utf8Path {
&self.config_dir
}
fn data_dir(&self) -> &Utf8Path {
&self.data_dir
}
}