summaryrefslogtreecommitdiff
path: root/core/modules.rs
diff options
context:
space:
mode:
Diffstat (limited to 'core/modules.rs')
-rw-r--r--core/modules.rs45
1 files changed, 45 insertions, 0 deletions
diff --git a/core/modules.rs b/core/modules.rs
index c12f900bb..ffae3a476 100644
--- a/core/modules.rs
+++ b/core/modules.rs
@@ -130,6 +130,51 @@ impl ModuleLoader for NoopModuleLoader {
}
}
+/// Basic file system module loader.
+///
+/// Note that this loader will **block** event loop
+/// when loading file as it uses synchronous FS API
+/// from standard library.
+pub struct FsModuleLoader;
+
+impl ModuleLoader for FsModuleLoader {
+ fn resolve(
+ &self,
+ _op_state: Rc<RefCell<OpState>>,
+ specifier: &str,
+ referrer: &str,
+ _is_main: bool,
+ ) -> Result<ModuleSpecifier, AnyError> {
+ Ok(ModuleSpecifier::resolve_import(specifier, referrer)?)
+ }
+
+ fn load(
+ &self,
+ _op_state: Rc<RefCell<OpState>>,
+ module_specifier: &ModuleSpecifier,
+ _maybe_referrer: Option<ModuleSpecifier>,
+ _is_dynamic: bool,
+ ) -> Pin<Box<ModuleSourceFuture>> {
+ let module_specifier = module_specifier.clone();
+ async move {
+ let path = module_specifier.as_url().to_file_path().map_err(|_| {
+ generic_error(format!(
+ "Provided module specifier \"{}\" is not a file URL.",
+ module_specifier
+ ))
+ })?;
+ let code = std::fs::read_to_string(path)?;
+ let module = ModuleSource {
+ code,
+ module_url_specified: module_specifier.to_string(),
+ module_url_found: module_specifier.to_string(),
+ };
+ Ok(module)
+ }
+ .boxed_local()
+ }
+}
+
#[derive(Debug, Eq, PartialEq)]
enum Kind {
Main,