use crate::file::{DirEntry, File, Metadata, OpenOptions};
use mockall::automock;
use std::io::ErrorKind;
pub use error::*;
#[automock]
pub trait FileSystem {
fn create_dir(&self, path: &str) -> Result<()>;
fn metadata(&self, path: &str) -> Result<Metadata>;
fn open_file_options(&self, path: &str, options: &OpenOptions) -> Result<Box<dyn File>>;
fn read_dir(&self, path: &str) -> Result<Box<dyn Iterator<Item = Result<DirEntry>>>>;
fn remove_dir(&self, path: &str) -> Result<()>;
fn remove_file(&self, path: &str) -> Result<()>;
fn create_dir_all(&self, path: &str) -> Result<()> {
util::create_dir_all(self, path)
}
fn create_file(&self, path: &str) -> Result<Box<dyn File>> {
self.open_file_options(path, &OpenOptions::default().create(true).truncate(true))
}
fn exists(&self, path: &str) -> Result<bool> {
match self.metadata(path) {
Ok(_) => Ok(true),
Err(err) if err.kind() == ErrorKind::NotFound => Ok(false),
Err(err) => Err(err),
}
}
fn open_file(&self, path: &str) -> Result<Box<dyn File>> {
self.open_file_options(path, &OpenOptions::default())
}
}
impl<FS: FileSystem + ?Sized> FileSystem for Box<FS> {
fn create_dir(&self, path: &str) -> Result<()> { (**self).create_dir(path) }
fn metadata(&self, path: &str) -> Result<Metadata> { (**self).metadata(path) }
fn open_file_options(&self, path: &str, options: &OpenOptions) -> Result<Box<dyn File>> { (**self).open_file_options(path, options) }
fn read_dir(&self, path: &str) -> Result<Box<dyn Iterator<Item = Result<DirEntry>>>> { (**self).read_dir(path) }
fn remove_dir(&self, path: &str) -> Result<()> { (**self).remove_dir(path) }
fn remove_file(&self, path: &str) -> Result<()> { (**self).remove_file(path) }
}
pub mod error;
pub mod file;
pub mod memory_fs;
pub mod mountable_fs;
pub mod physical_fs;
pub mod roc_fs;
pub mod scoped_fs;
pub mod tar_fs;
mod tree;
pub mod util;
pub mod zip_fs;