use rustyscript::{module, Error, Module, ModuleHandle, Runtime, RuntimeOptions};
use std::time::Duration;
mod example_extension;
const MY_MODULE: Module = module!(
"my_module.js",
"export function importantFunction() {
return 42;
}"
);
pub struct MyRuntime(Runtime);
impl MyRuntime {
pub fn new() -> Result<Self, Error> {
let mut runtime = Self(Runtime::new(RuntimeOptions {
extensions: vec![example_extension::example_extension::init_ops_and_esm()],
timeout: Duration::from_millis(500),
..Default::default()
})?);
runtime.load_module(&MY_MODULE)?;
Ok(runtime)
}
pub fn call_function<T>(
&mut self,
module_context: &ModuleHandle,
name: &str,
args: &impl serde::ser::Serialize,
) -> Result<T, Error>
where
T: deno_core::serde::de::DeserializeOwned,
{
self.0.call_function(Some(module_context), name, args)
}
pub fn get_value<T>(&mut self, module_context: &ModuleHandle, name: &str) -> Result<T, Error>
where
T: serde::de::DeserializeOwned,
{
self.0.get_value(Some(module_context), name)
}
pub fn load_module(&mut self, module: &Module) -> Result<ModuleHandle, Error> {
self.0.load_module(module)
}
}
fn main() -> Result<(), Error> {
let module = Module::new(
"test.js",
"
import * as myModule from './my_module.js';
export const value = myModule.importantFunction();
",
);
let mut runtime = MyRuntime::new()?;
let module_context = runtime.load_module(&module)?;
let value: i32 = runtime.get_value(&module_context, "value")?;
assert_eq!(42, value);
Ok(())
}