garbage_fs/
lib.rs

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
10/// Abstraction for all filesystem operations
11pub 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  /// Check if a path exists WITHOUT resolving symlinks.
39  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  // File stuff
48
49  /// File::open
50  fn open_file<P: AsRef<Path>>(&self, path: P) -> IoResult<Self::File>;
51
52  /// File::create
53  fn create_file<P: AsRef<Path>>(&self, path: P) -> IoResult<Self::File>;
54}
55
56/// Abstraction for all file operations
57pub trait File: Write {}