use std::io;
use std::path::{Path, PathBuf};
pub trait FileSystem: Send + Sync {
fn read_to_string(&self, path: &Path) -> io::Result<String>;
fn write(&self, path: &Path, contents: &[u8]) -> io::Result<()>;
fn exists(&self, path: &Path) -> bool;
fn create_dir_all(&self, path: &Path) -> io::Result<()>;
fn read_dir(&self, path: &Path) -> io::Result<Vec<PathBuf>>;
fn remove_file(&self, path: &Path) -> io::Result<()>;
fn remove_dir_all(&self, path: &Path) -> io::Result<()>;
fn is_dir(&self, path: &Path) -> bool;
fn is_file(&self, path: &Path) -> bool;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct StdFs;
impl FileSystem for StdFs {
fn read_to_string(&self, path: &Path) -> io::Result<String> {
std::fs::read_to_string(path)
}
fn write(&self, path: &Path, contents: &[u8]) -> io::Result<()> {
std::fs::write(path, contents)
}
fn exists(&self, path: &Path) -> bool {
path.exists()
}
fn create_dir_all(&self, path: &Path) -> io::Result<()> {
std::fs::create_dir_all(path)
}
fn read_dir(&self, path: &Path) -> io::Result<Vec<PathBuf>> {
let entries = std::fs::read_dir(path)?;
let mut out = Vec::new();
for entry in entries {
let entry = entry?;
out.push(entry.path());
}
Ok(out)
}
fn remove_file(&self, path: &Path) -> io::Result<()> {
std::fs::remove_file(path)
}
fn remove_dir_all(&self, path: &Path) -> io::Result<()> {
std::fs::remove_dir_all(path)
}
fn is_dir(&self, path: &Path) -> bool {
path.is_dir()
}
fn is_file(&self, path: &Path) -> bool {
path.is_file()
}
}