deterministic-wasi-ctx 0.1.21

A wasi-common WasiCtx implementation that is fully deterministic
Documentation
use std::path::Path;
use wasi_common::WasiCtx;
use wasmtime::*;

pub fn create_instance(module_name: &str) -> (Store<WasiCtx>, Instance) {
    let wasi = deterministic_wasi_ctx::build_wasi_ctx();
    let engine = Engine::default();
    let mut linker = Linker::new(&engine);
    wasi_common::sync::add_to_linker(&mut linker, |s| s).unwrap();
    let module_path = Path::new("../../target/wasm32-wasi/debug").join(module_name);
    let module = Module::from_file(&engine, module_path).unwrap();
    let mut store = Store::new(&engine, wasi);
    linker.module(&mut store, "", &module).unwrap();
    let instance = linker.instantiate(&mut store, &module).unwrap();
    (store, instance)
}

pub fn invoke_func<Params, Results>(
    mut store: Store<WasiCtx>,
    instance: Instance,
    func_name: &str,
    params: Params,
) -> Results
where
    Params: WasmParams,
    Results: WasmResults,
{
    let answer = instance
        .get_func(&mut store, func_name)
        .unwrap_or_else(|| panic!("`{}` was not an exported function", func_name));
    let answer = answer.typed::<Params, Results>(&store).unwrap();
    answer.call(&mut store, params).unwrap()
}