use std::fmt::Debug;
use std::process;
use std::sync::Arc;
use std::sync::atomic::{
AtomicU64,
Ordering,
};
use std::time::{
SystemTime,
UNIX_EPOCH,
};
use crate::{
FileSystem,
FsPath,
FsResult,
TempDir,
TempDirOptions,
TempFile,
TempFileOptions,
};
static TEMP_COUNTER: AtomicU64 = AtomicU64::new(0);
pub trait TempResourceFactory: Debug + Send + Sync {
fn create_file(&self, owner: Arc<dyn FileSystem>, options: &TempFileOptions) -> FsResult<Box<dyn TempFile>>;
fn create_dir(&self, owner: Arc<dyn FileSystem>, options: &TempDirOptions) -> FsResult<Box<dyn TempDir>>;
fn make_temp_path(&self, parent: Option<&FsPath>, prefix: &str, suffix: &str) -> FsResult<FsPath> {
let parent = parent.cloned().unwrap_or_else(FsPath::root);
let counter = TEMP_COUNTER.fetch_add(1, Ordering::Relaxed);
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_nanos();
let name = format!("{prefix}{}-{nanos}-{counter}{suffix}", process::id());
parent.join(&name)
}
}