Skip to main content

InMemoryFs

Struct InMemoryFs 

Source
pub struct InMemoryFs { /* private fields */ }
Expand description

An in-memory, clone-shared Storage backend.

Content lives behind Arc<RwLock<_>>, so cloning an InMemoryFs is cheap and every clone sees the same files — the same relationship an Arc<StdFs> has to the one real filesystem it names, but without needing the Arc wrapper, since it’s built into the type. std::sync::RwLock (not a runtime’s async lock) is deliberate: every method here runs to completion without ever awaiting inside the critical section, so there is nothing for an async lock to buy, and a plain std::sync primitive is the one that’s guaranteed to exist — and to compile — on wasm32-unknown-unknown, which has no threads and no async-runtime assumption to lean on.

Text and binary content are stored separately (a write picks one store based on whether the bytes are valid UTF-8) so that a round-trip through export_entries — text only — stays plain strings, the shape a JS/WASM caller wants. Directories are tracked explicitly (in a HashSet) rather than inferred from file paths, so an empty directory create_dir_all created still shows up in read_dir.

Symlinks may be added with add_symlink: reading or getting metadata of the link resolves to the target’s content, matching ReadStorage::metadata’s documented “follows symlinks” contract. Resolution is a single hop, not a followed chain — a symlink to a symlink is not resolved further — which is all the coherence a test double needs; a real filesystem’s chain-following and cycle detection isn’t reproduced here.

Implementations§

Source§

impl InMemoryFs

Source

pub fn new() -> Self

An empty in-memory filesystem.

Source

pub fn with_files(entries: Vec<(PathBuf, String)>) -> Self

A filesystem pre-populated with text files (and the directories that contain them).

Source

pub fn load_from_entries(entries: Vec<(String, String)>) -> Self

Load files from (path_string, content) pairs — convenience for a caller (JS/WASM interop) that only has strings, not PathBufs.

Source

pub fn export_entries(&self) -> Vec<(String, String)>

Every text file, as (path_string, content) pairs — the counterpart to load_from_entries, for persisting a session’s edits back out.

Source

pub fn export_binary_entries(&self) -> Vec<(String, Vec<u8>)>

Every binary file, as (path_string, content_bytes) pairs.

Source

pub fn load_binary_entries(&self, entries: Vec<(String, Vec<u8>)>)

Load binary files from (path_string, content_bytes) pairs.

Source

pub fn list_all_files(&self) -> Vec<PathBuf>

Every text-file path currently stored.

Source

pub fn clear(&self)

Remove every file, directory, and symlink — resetting the filesystem to empty without needing a fresh InMemoryFs (and its own, separately shared, clones).

Add a symlink from link to target. Reading link (or its metadata) resolves to target’s content; link’s entry in its parent’s read_dir reports FileType::SYMLINK — the un-followed type a caller needs in order to recognize and skip it, since metadata itself only ever reports the followed, resolved type.

Trait Implementations§

Source§

impl Clone for InMemoryFs

Source§

fn clone(&self) -> InMemoryFs

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for InMemoryFs

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for InMemoryFs

Source§

fn default() -> InMemoryFs

Returns the “default value” for a type. Read more
Source§

impl ReadStorage for InMemoryFs

Source§

async fn read(&self, path: &Path) -> Result<Vec<u8>>

Read the entire contents of a file as bytes. Mirrors std::fs::read.
Source§

async fn read_to_string(&self, path: &Path) -> Result<String>

Read the entire contents of a file as a string. Mirrors std::fs::read_to_string.
Source§

async fn read_dir(&self, path: &Path) -> Result<Vec<DirEntry>>

Return the entries in a directory (non-recursive). Mirrors std::fs::read_dir, but yields a Vec since async iterators are not yet stable.
Source§

async fn metadata(&self, path: &Path) -> Result<Metadata>

Return metadata about the entry at path. Mirrors std::fs::metadata; follows symlinks.
Source§

fn try_exists(&self, path: &Path) -> impl Future<Output = Result<bool, Error>>

Returns Ok(true) if the path exists, Ok(false) if it does not, and Err(_) if the check itself failed. Mirrors std::fs::try_exists.
Source§

impl Storage for InMemoryFs

Source§

async fn write(&self, path: &Path, contents: &[u8]) -> Result<()>

Write a file, replacing it if it already exists. Mirrors std::fs::write.
Source§

async fn create_dir_all(&self, path: &Path) -> Result<()>

Create a directory and all missing parents. Mirrors std::fs::create_dir_all.
Source§

async fn remove_file(&self, path: &Path) -> Result<()>

Remove a regular file. Mirrors std::fs::remove_file.
Source§

async fn remove_dir_all(&self, path: &Path) -> Result<()>

Recursively remove a directory and its contents. Mirrors std::fs::remove_dir_all.
Source§

async fn rename(&self, from: &Path, to: &Path) -> Result<()>

Rename or move a file or directory. Mirrors std::fs::rename.
Source§

fn capabilities(&self) -> Capabilities

What durability guarantees this backend can make. Defaults to Capabilities::NONE — a backend promises a guarantee only by saying so, so an adapter that forgets to override this degrades to the most defensive path rather than to a false promise.
Source§

async fn write_atomic(&self, path: &Path, contents: &[u8]) -> Result<()>

Replace path’s contents with contents atomically and durably: no observer — concurrent reader or post-crash survivor — ever sees a splice of old and new bytes, and once this returns the new contents outlive a power loss. Read more
Source§

fn sync( &self, path: &Path, need: Durability, ) -> impl Future<Output = Result<()>>

Flush path — and nothing else — to the strength need asks for. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.