1pub mod stdfs;
2
3#[cfg(test)]
4pub mod mock;
5
6use std::fs::Metadata;
7use std::io::{ErrorKind, Result as IoResult, Write};
8use std::path::{Path, PathBuf};
9
10pub trait Filesystem {
12 type File: File;
13
14 fn create_dir<P: AsRef<Path>>(&self, path: P) -> IoResult<()>;
15
16 fn create_dir_all<P: AsRef<Path>>(&self, path: P) -> IoResult<()>;
17
18 fn rename<P: AsRef<Path>, Q: AsRef<Path>>(
19 &self,
20 from: P,
21 to: Q,
22 ) -> IoResult<()>;
23
24 fn remove_file<P: AsRef<Path>>(&self, path: P) -> IoResult<()>;
25
26 fn remove_dir_all<P: AsRef<Path>>(&self, path: P) -> IoResult<()>;
27
28 fn read_link<P: AsRef<Path>>(&self, path: P) -> IoResult<PathBuf>;
29
30 fn path_metadata<P: AsRef<Path>>(&self, path: P) -> IoResult<Metadata>;
31
32 fn symlink_metadata<P: AsRef<Path>>(&self, path: P) -> IoResult<Metadata>;
33
34 fn file_metadata(&self, file: &Self::File) -> IoResult<Metadata>;
35
36 fn path_exists<P: AsRef<Path>>(&self, path: P) -> IoResult<bool>;
37
38 fn symlink_exists<P: AsRef<Path>>(&self, path: P) -> IoResult<bool> {
40 match self.symlink_metadata(path) {
41 Ok(_) => Ok(true),
42 Err(err) if matches!(err.kind(), ErrorKind::NotFound) => Ok(false),
43 Err(err) => Err(err.into()),
44 }
45 }
46
47 fn open_file<P: AsRef<Path>>(&self, path: P) -> IoResult<Self::File>;
51
52 fn create_file<P: AsRef<Path>>(&self, path: P) -> IoResult<Self::File>;
54}
55
56pub trait File: Write {}