diff options
Diffstat (limited to 'core/modules.rs')
-rw-r--r-- | core/modules.rs | 45 |
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, |