pub struct Memory { /* private fields */ }
Expand description
Virtual file system for sources, extensions, and require metadata.
Memory
is a HashMap
from paths to an entry struct that contains:
- A bit for whether the path that points to the entry has been required before.
- Optional binary content representing Ruby source code.
- Optional hook to a Rust function to be executed on
require
(similar to a MRI C extension rubygem).
Sources in Memory
are only writable via the LoadSources
trait. Sources
can only be completely replaced.
These APIs are consumed primarily by the Kernel::require
implementation in
extn::core::kernel::require
.
Implementations§
Source§impl Memory
impl Memory
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new in memory virtual file system.
Sets the current working directory of the virtual file system to
RUBY_LOAD_PATH
for storing Ruby source files. This path is searched
by Kernel::require
, Kernel::require_relative
, and Kernel::load
.
Sourcepub fn with_working_directory<T>(cwd: T) -> Self
pub fn with_working_directory<T>(cwd: T) -> Self
Create a new in memory virtual file system with the given working directory.
Sourcepub fn resolve_file(&self, path: &Path) -> Option<Vec<u8>>
pub fn resolve_file(&self, path: &Path) -> Option<Vec<u8>>
Check whether path
points to a file in the virtual file system and
return the absolute path if it exists.
This API is infallible and will return None
for non-existent paths.
Sourcepub fn is_file(&self, path: &Path) -> bool
pub fn is_file(&self, path: &Path) -> bool
Check whether path
points to a file in the virtual file system.
This API is infallible and will return false
for non-existent paths.
Sourcepub fn read_file(&self, path: &Path) -> Result<Vec<u8>>
pub fn read_file(&self, path: &Path) -> Result<Vec<u8>>
Read file contents for the file at path
.
Returns a byte slice of complete file contents. If path
is relative,
it is absolutized relative to the current working directory of the
virtual file system.
§Errors
If path
does not exist, an io::Error
with error kind
io::ErrorKind::NotFound
is returned.
Sourcepub fn write_file(&mut self, path: &Path, buf: Cow<'static, [u8]>) -> Result<()>
pub fn write_file(&mut self, path: &Path, buf: Cow<'static, [u8]>) -> Result<()>
Write file contents into the virtual file system at path
.
Writes the full file contents. If any file contents already exist at
path
, they are replaced. Extension hooks are preserved.
§Errors
This API is currently infallible but returns io::Result
to reserve
the ability to return errors in the future.
Sourcepub fn get_extension(&self, path: &Path) -> Option<ExtensionHook>
pub fn get_extension(&self, path: &Path) -> Option<ExtensionHook>
Retrieve an extension hook for the file at path
.
This API is infallible and will return None
for non-existent paths.
Sourcepub fn register_extension(
&mut self,
path: &Path,
extension: ExtensionHook,
) -> Result<()>
pub fn register_extension( &mut self, path: &Path, extension: ExtensionHook, ) -> Result<()>
Write extension hook into the virtual file system at path
.
If any extension hooks already exist at path
, they are replaced. File
contents are preserved.
§Errors
This API is currently infallible but returns io::Result
to reserve
the ability to return errors in the future.
Sourcepub fn is_required(&self, path: &Path) -> Option<bool>
pub fn is_required(&self, path: &Path) -> Option<bool>
Check whether a file at path
has been required already.
This API is infallible and will return false
for non-existent paths.
Sourcepub fn mark_required(&mut self, path: &Path) -> Result<()>
pub fn mark_required(&mut self, path: &Path) -> Result<()>
Mark a source at path
as required on the interpreter.
This metadata is used by Kernel#require
and friends to enforce that
Ruby sources are only loaded into the interpreter once to limit side
effects.
§Errors
If path
does not exist, an io::Error
with error kind
io::ErrorKind::NotFound
is returned.