diff options
| author | LLLL Colonq <llll@colonq> | 2024-08-16 15:29:23 -0400 |
|---|---|---|
| committer | LLLL Colonq <llll@colonq> | 2024-08-16 15:29:23 -0400 |
| commit | 7874c1d28bccbd4e089e0a7a2a8c8ad005aa09e8 (patch) | |
| tree | b3dd88f550b7e1b77a8ab63759362fba405f0ac4 /src/module.rs | |
| parent | 2b0a405e36e346ff1b8fe33cc359918b210ef6f3 (diff) | |
Update
Diffstat (limited to 'src/module.rs')
| -rw-r--r-- | src/module.rs | 45 |
1 files changed, 45 insertions, 0 deletions
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<Self> { + 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::<js_sys::WebAssembly::Instance>() { + 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::<js_sys::Function>() { + let _ = func.call0(&JsValue::undefined()); + } else { + log::warn!("couldn't cast module function: {}", nm); + } + } else { + log::warn!("couldn't find module function: {}", nm); + } + } +} |
