diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2023-03-30 03:20:31 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-30 03:20:31 +0200 |
commit | 913e2875c1c31d5ffbc9c0c9ed0e8c63f6143024 (patch) | |
tree | 439fa7eef067893fde75dfe386d801a090e6c057 /ext/node/lib.rs | |
parent | 89bbbd102c6050763105be39a49494a5ffdce35b (diff) |
refactor(ext/node): add NodeEnv::Fs associated type (#18484)
This commit adds associated type to "NodeEnv" trait, called "Fs".
The "Fs" type has a trait bound on "NodeFs", which specifies APIs
required for all ops and resolution APIs to function.
A "RealFs" implementation of "NodeFs" is exported from the "deno_node"
crate, that provides a default implementation for the trait.
All code in "deno_node" extension was changed to use the "NodeFs" trait
to handle file system operations, instead of relying on APIs from the
standard library.
Diffstat (limited to 'ext/node/lib.rs')
-rw-r--r-- | ext/node/lib.rs | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/ext/node/lib.rs b/ext/node/lib.rs index 1693a82ef..f3bdb7e5b 100644 --- a/ext/node/lib.rs +++ b/ext/node/lib.rs @@ -6,6 +6,7 @@ use deno_core::op; use deno_core::JsRuntime; use once_cell::sync::Lazy; use std::collections::HashSet; +use std::io; use std::path::Path; use std::path::PathBuf; use std::rc::Rc; @@ -41,18 +42,36 @@ pub use resolution::DEFAULT_CONDITIONS; pub trait NodeEnv { type P: NodePermissions; - // TODO(bartlomieju): - // type Fs: NodeFs; + type Fs: NodeFs; } pub trait NodePermissions { fn check_read(&mut self, path: &Path) -> Result<(), AnyError>; } -// TODO(bartlomieju): -// pub trait NodeFs { -// fn current_dir() -> Result<PathBuf, AnyError>; -// } +pub trait NodeFs { + fn current_dir() -> io::Result<PathBuf>; + fn metadata<P: AsRef<Path>>(path: P) -> io::Result<std::fs::Metadata>; + fn read_to_string<P: AsRef<Path>>(path: P) -> io::Result<String>; +} + +pub struct RealFs; +impl NodeFs for RealFs { + fn current_dir() -> io::Result<PathBuf> { + #[allow(clippy::disallowed_methods)] + std::env::current_dir() + } + + fn metadata<P: AsRef<Path>>(path: P) -> io::Result<std::fs::Metadata> { + #[allow(clippy::disallowed_methods)] + std::fs::metadata(path) + } + + fn read_to_string<P: AsRef<Path>>(path: P) -> io::Result<String> { + #[allow(clippy::disallowed_methods)] + std::fs::read_to_string(path) + } +} pub trait RequireNpmResolver { fn resolve_package_folder_from_package( |