wasm-bridge 0.1.0

Run WASM modules on desktop or on the web using wasmtime's API
Documentation
use js_sys::{Function, WebAssembly};

use crate::*;

use std::marker::PhantomData;

#[derive(Clone, Debug)]
pub struct TypedFunc<'a, Params, Results> {
    _phantom: PhantomData<fn(params: Params) -> Results>,
    instance: &'a WebAssembly::Instance,
    function: Function,
}

impl<'a, Params: ToJsParams, Results: FromJsResults> TypedFunc<'a, Params, Results> {
    pub(crate) fn new(instance: &'a WebAssembly::Instance, function: Function) -> Self {
        Self {
            _phantom: PhantomData,
            instance,
            function,
        }
    }

    pub fn call(&self, _store: &Store<()>, params: Params) -> Result<Results, Error> {
        let args = params.to_js_params();
        let result = self.function.apply(self.instance.as_ref(), &args)?;
        Results::from_js_results(&result)
    }
}