use std::collections::HashMap;
use std::path::Path;
pub(super) fn collect_files(root: &Path) -> std::io::Result<HashMap<String, String>> {
let mut files = HashMap::new();
walk_dir(root, root, &mut files)?;
Ok(files)
}
fn walk_dir(root: &Path, dir: &Path, files: &mut HashMap<String, String>) -> std::io::Result<()> {
for entry in std::fs::read_dir(dir)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
walk_dir(root, &path, files)?;
} else {
let rel = path
.strip_prefix(root)
.unwrap_or(&path)
.to_string_lossy()
.to_string();
let contents = std::fs::read_to_string(&path).unwrap_or_default();
files.insert(rel, contents);
}
}
Ok(())
}
pub(super) fn restore_files(root: &Path, files: &HashMap<String, String>) -> std::io::Result<()> {
for (rel, contents) in files {
let path = root.join(rel);
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
std::fs::write(path, contents)?;
}
Ok(())
}
pub(super) fn clear_dir(root: &Path) {
if let Ok(entries) = std::fs::read_dir(root) {
for entry in entries.flatten() {
let path = entry.path();
if path.is_dir() {
let _ = std::fs::remove_dir_all(&path);
} else {
let _ = std::fs::remove_file(&path);
}
}
}
}