use std::fs;
use std::path::Path;
use std::path::PathBuf;
use std::process;
use super::constants::ANALYZING_DIR_NAME;
fn analyzing_dir(findings_dir: &Path) -> PathBuf { findings_dir.join(ANALYZING_DIR_NAME) }
pub(super) struct AnalyzingMarker {
path: Option<PathBuf>,
}
impl AnalyzingMarker {
pub(super) fn new(findings_dir: &Path, crate_name: &str) -> Self {
let directory = analyzing_dir(findings_dir);
if fs::create_dir_all(&directory).is_err() {
return Self { path: None };
}
let path = directory.join(process::id().to_string());
if fs::write(&path, crate_name).is_err() {
return Self { path: None };
}
Self { path: Some(path) }
}
}
impl Drop for AnalyzingMarker {
fn drop(&mut self) {
if let Some(path) = self.path.as_ref() {
let _ = fs::remove_file(path);
}
}
}
pub(super) fn targets_in_flight(findings_dir: &Path) -> Vec<String> {
let Ok(entries) = fs::read_dir(analyzing_dir(findings_dir)) else {
return Vec::new();
};
let mut names: Vec<String> = entries
.flatten()
.filter_map(|entry| fs::read_to_string(entry.path()).ok())
.filter(|crate_name| !crate_name.is_empty())
.collect();
names.sort_unstable();
names.dedup();
names
}