use std::fs;
use std::io::Read;
use std::path::Path;
use std::path::PathBuf;
use std::sync::atomic::{
AtomicU64,
Ordering,
};
use crate::{
MimeError,
MimeResult,
};
pub(crate) fn validate_readable_file(path: &Path) -> MimeResult<()> {
let metadata = fs::metadata(path)?;
if !metadata.is_file() {
return Err(MimeError::invalid_classifier_input(format!(
"path is not a regular file: {}",
path.display()
)));
}
fs::File::open(path)?;
Ok(())
}
pub(crate) fn with_temp_reader<T>(
reader: &mut dyn Read,
classify: impl FnOnce(&Path) -> MimeResult<T>,
) -> MimeResult<T> {
let path = unique_temp_path("FileBasedMediaStreamClassifier", ".tmp");
let mut content = Vec::new();
reader.read_to_end(&mut content)?;
fs::write(&path, content)?;
let result = classify(&path);
let _ = fs::remove_file(&path);
result
}
fn unique_temp_path(prefix: &str, suffix: &str) -> PathBuf {
static COUNTER: AtomicU64 = AtomicU64::new(0);
let counter = COUNTER.fetch_add(1, Ordering::Relaxed);
std::env::temp_dir().join(format!("{prefix}-{}-{counter}{suffix}", std::process::id()))
}