use std::sync::Arc;
use crate::{
CreateDirOptions,
FileSystem,
FsResult,
ManagedTempDir,
ManagedTempFile,
TempDir,
TempDirOptions,
TempFile,
TempFileOptions,
TempResourceFactory,
WriteMode,
WriteOptions,
};
#[derive(Debug)]
pub struct ManagedTempResourceFactory;
impl ManagedTempResourceFactory {
#[must_use]
pub fn shared() -> &'static Self {
static FACTORY: ManagedTempResourceFactory = ManagedTempResourceFactory;
&FACTORY
}
}
impl TempResourceFactory for ManagedTempResourceFactory {
fn create_file(&self, owner: Arc<dyn FileSystem>, options: &TempFileOptions) -> FsResult<Box<dyn TempFile>> {
let path = self.make_temp_path(options.parent.as_ref(), &options.prefix, &options.suffix)?;
let writer_options = WriteOptions {
create_parent: true,
mode: WriteMode::CreateNew,
..WriteOptions::default()
};
owner.open_writer(&path, &writer_options)?.commit()?;
Ok(Box::new(ManagedTempFile::new(owner, path)))
}
fn create_dir(&self, owner: Arc<dyn FileSystem>, options: &TempDirOptions) -> FsResult<Box<dyn TempDir>> {
let path = self.make_temp_path(options.parent.as_ref(), &options.prefix, &options.suffix)?;
owner.create_dir(
&path,
&CreateDirOptions {
recursive: true,
..CreateDirOptions::default()
},
)?;
Ok(Box::new(ManagedTempDir::new(owner, path)))
}
}