1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)
    }
}