use crate::not_found;
use cap_std::fs::Dir;
use cap_std::{ambient_authority, AmbientAuthority};
use std::{fs, io};
#[derive(Clone)]
pub struct ProjectDirs {
inner: directories::ProjectDirs,
}
impl ProjectDirs {
pub fn from(
qualifier: &str,
organization: &str,
application: &str,
ambient_authority: AmbientAuthority,
) -> Option<Self> {
let _ = ambient_authority;
let inner = directories::ProjectDirs::from(qualifier, organization, application)?;
Some(Self { inner })
}
pub fn cache_dir(&self) -> io::Result<Dir> {
let path = self.inner.cache_dir();
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority())
}
pub fn config_dir(&self) -> io::Result<Dir> {
let path = self.inner.config_dir();
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority())
}
pub fn data_dir(&self) -> io::Result<Dir> {
let path = self.inner.data_dir();
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority())
}
pub fn data_local_dir(&self) -> io::Result<Dir> {
let path = self.inner.data_local_dir();
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority())
}
pub fn runtime_dir(&self) -> io::Result<Dir> {
let path = self.inner.runtime_dir().ok_or_else(not_found)?;
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority())
}
pub fn state_dir(&self) -> io::Result<Option<Dir>> {
let Some(path) = self.inner.state_dir() else {
return Ok(None);
};
fs::create_dir_all(path)?;
Dir::open_ambient_dir(path, ambient_authority()).map(Some)
}
}