From 7874c1d28bccbd4e089e0a7a2a8c8ad005aa09e8 Mon Sep 17 00:00:00 2001 From: LLLL Colonq Date: Fri, 16 Aug 2024 15:29:23 -0400 Subject: Update --- src/module.rs | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/module.rs (limited to 'src/module.rs') diff --git a/src/module.rs b/src/module.rs new file mode 100644 index 0000000..1fc4100 --- /dev/null +++ b/src/module.rs @@ -0,0 +1,45 @@ +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub fn log_info(msg: i8) { + log::info!("{:?}", msg); +} + +#[wasm_bindgen(module="/src/js/module.js")] +extern "C" { + fn js_build_interface() -> js_sys::Object; +} + +pub struct Module { + pub wasm: js_sys::WebAssembly::Instance, +} + +impl Module { + pub async fn new(bytes: &[u8]) -> Option { + let imp = js_build_interface(); + let o = wasm_bindgen_futures::JsFuture::from( + js_sys::WebAssembly::instantiate_buffer(bytes, &imp) + ).await.unwrap(); + let i = js_sys::Reflect::get(&o, &"instance".into()).unwrap(); + if let Ok(wasm) = i.dyn_into::() { + Some(Self { + wasm, + }) + } else { + log::info!("failed 3"); + None + } + } + pub fn call(&self, nm: &str) { + let exp = self.wasm.exports(); + if let Ok(fo) = js_sys::Reflect::get(&exp, &nm.into()) { + if let Ok(func) = fo.dyn_into::() { + let _ = func.call0(&JsValue::undefined()); + } else { + log::warn!("couldn't cast module function: {}", nm); + } + } else { + log::warn!("couldn't find module function: {}", nm); + } + } +} -- cgit v1.2.3