summaryrefslogtreecommitdiff
path: root/src/module.rs
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2024-08-16 15:29:23 -0400
committerLLLL Colonq <llll@colonq>2024-08-16 15:29:23 -0400
commit7874c1d28bccbd4e089e0a7a2a8c8ad005aa09e8 (patch)
treeb3dd88f550b7e1b77a8ab63759362fba405f0ac4 /src/module.rs
parent2b0a405e36e346ff1b8fe33cc359918b210ef6f3 (diff)
Update
Diffstat (limited to 'src/module.rs')
-rw-r--r--src/module.rs45
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);
+ }
+ }
+}