1use crate::io::ApiResult;
3use crate::prelude::{create_dir_all, remove_dir_all, temp_dir, Path, PathBuf};
4use color_eyre::eyre::eyre;
5use nanoid::nanoid;
6
7#[derive(Debug)]
9pub struct TemporaryDirectory(PathBuf);
10impl TemporaryDirectory {
11 pub fn create(namespace: &str) -> ApiResult<Self> {
13 let path = temp_dir().join(format!("{namespace}-{}", nanoid!()));
14 create_dir_all(&path)
15 .map(|()| Self(path))
16 .map_err(|why| eyre!("Failed to create temporary directory — {why}"))
17 }
18 pub fn path(&self) -> &Path {
20 &self.0
21 }
22}
23impl AsRef<Path> for TemporaryDirectory {
24 fn as_ref(&self) -> &Path {
25 self.path()
26 }
27}
28impl Drop for TemporaryDirectory {
29 fn drop(&mut self) {
30 let _ = remove_dir_all(&self.0);
31 }
32}