Struct virtual_fs::OverlayFileSystem
source · pub struct OverlayFileSystem<P, S> {
primary: Arc<P>,
secondaries: S,
}
Expand description
A primary filesystem and chain of secondary filesystems that are overlayed on top of each other.
§Precedence
The OverlayFileSystem
will execute operations based on precedence.
Most importantly, this means earlier filesystems can shadow files and directories that have a lower precedence.
§Examples
Something useful to know is that the FileSystems
trait is implemented
for both arrays and tuples.
For example, if you want to create a crate::FileSystem
which will
create files in-memory while still being able to read from the host, you
might do something like this:
use virtual_fs::{
mem_fs::FileSystem as MemFS,
host_fs::FileSystem as HostFS,
OverlayFileSystem,
};
let runtime = tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.unwrap();
let _guard = runtime.enter();
let fs = OverlayFileSystem::new(MemFS::default(), [HostFS::new(tokio::runtime::Handle::current(), "/").unwrap()]);
// This also has the benefit of storing the two values in-line with no extra
// overhead or indirection.
assert_eq!(
std::mem::size_of_val(&fs),
std::mem::size_of::<(MemFS, HostFS)>(),
);
A more complex example is
Fields§
§primary: Arc<P>
§secondaries: S
Implementations§
source§impl<P, S> OverlayFileSystem<P, S>
impl<P, S> OverlayFileSystem<P, S>
sourcepub fn new(primary: P, secondaries: S) -> Self
pub fn new(primary: P, secondaries: S) -> Self
Create a new FileSystem
using a primary crate::FileSystem
and a
chain of secondary FileSystems
.
sourcepub fn secondaries(&self) -> &S
pub fn secondaries(&self) -> &S
Get a reference to the secondary filesystems.
sourcepub fn secondaries_mut(&mut self) -> &mut S
pub fn secondaries_mut(&mut self) -> &mut S
Get a mutable reference to the secondary filesystems.
fn permission_error_or_not_found(&self, path: &Path) -> Result<(), FsError>
Trait Implementations§
source§impl<P: Clone, S: Clone> Clone for OverlayFileSystem<P, S>
impl<P: Clone, S: Clone> Clone for OverlayFileSystem<P, S>
source§fn clone(&self) -> OverlayFileSystem<P, S>
fn clone(&self) -> OverlayFileSystem<P, S>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<P, S> Debug for OverlayFileSystem<P, S>where
P: FileSystem,
S: for<'a> FileSystems<'a>,
impl<P, S> Debug for OverlayFileSystem<P, S>where
P: FileSystem,
S: for<'a> FileSystems<'a>,
source§impl<P, S> FileOpener for OverlayFileSystem<P, S>where
P: FileSystem + Send + 'static,
S: for<'a> FileSystems<'a> + Send + Sync + 'static,
for<'a> <<S as FileSystems<'a>>::Iter as IntoIterator>::IntoIter: Send,
impl<P, S> FileOpener for OverlayFileSystem<P, S>where
P: FileSystem + Send + 'static,
S: for<'a> FileSystems<'a> + Send + Sync + 'static,
for<'a> <<S as FileSystems<'a>>::Iter as IntoIterator>::IntoIter: Send,
source§impl<P, S> FileSystem for OverlayFileSystem<P, S>where
P: FileSystem + Send + 'static,
S: for<'a> FileSystems<'a> + Send + Sync + 'static,
for<'a> <<S as FileSystems<'a>>::Iter as IntoIterator>::IntoIter: Send,
impl<P, S> FileSystem for OverlayFileSystem<P, S>where
P: FileSystem + Send + 'static,
S: for<'a> FileSystems<'a> + Send + Sync + 'static,
for<'a> <<S as FileSystems<'a>>::Iter as IntoIterator>::IntoIter: Send,
fn readlink(&self, path: &Path) -> Result<PathBuf>
fn read_dir(&self, path: &Path) -> Result<ReadDir, FsError>
fn create_dir(&self, path: &Path) -> Result<(), FsError>
fn remove_dir(&self, path: &Path) -> Result<(), FsError>
fn rename<'a>( &'a self, from: &'a Path, to: &'a Path, ) -> BoxFuture<'a, Result<(), FsError>>
fn metadata(&self, path: &Path) -> Result<Metadata, FsError>
source§fn symlink_metadata(&self, path: &Path) -> Result<Metadata>
fn symlink_metadata(&self, path: &Path) -> Result<Metadata>
metadata
because symlinks aren’t implemented
yet.fn remove_file(&self, path: &Path) -> Result<(), FsError>
fn new_open_options(&self) -> OpenOptions<'_>
fn mount( &self, _name: String, _path: &Path, _fs: Box<dyn FileSystem + Send + Sync>, ) -> Result<(), FsError>
source§impl<P: PartialEq, S: PartialEq> PartialEq for OverlayFileSystem<P, S>
impl<P: PartialEq, S: PartialEq> PartialEq for OverlayFileSystem<P, S>
source§fn eq(&self, other: &OverlayFileSystem<P, S>) -> bool
fn eq(&self, other: &OverlayFileSystem<P, S>) -> bool
self
and other
values to be equal, and is used
by ==
.impl<P: Eq, S: Eq> Eq for OverlayFileSystem<P, S>
impl<P, S> StructuralPartialEq for OverlayFileSystem<P, S>
Auto Trait Implementations§
impl<P, S> Freeze for OverlayFileSystem<P, S>where
S: Freeze,
impl<P, S> RefUnwindSafe for OverlayFileSystem<P, S>where
S: RefUnwindSafe,
P: RefUnwindSafe,
impl<P, S> Send for OverlayFileSystem<P, S>
impl<P, S> Sync for OverlayFileSystem<P, S>
impl<P, S> Unpin for OverlayFileSystem<P, S>where
S: Unpin,
impl<P, S> UnwindSafe for OverlayFileSystem<P, S>where
S: UnwindSafe,
P: RefUnwindSafe,
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.