You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.6 KiB
47 lines
1.6 KiB
//! Example of instantiating a wasm module which uses WASI preview1 imports
|
|
//! implemented through the async preview2 WASI implementation.
|
|
|
|
/*
|
|
You can execute this example with:
|
|
cmake examples/
|
|
cargo run --example wasi-async
|
|
*/
|
|
|
|
use anyhow::Result;
|
|
use wasmtime::{Config, Engine, Linker, Module, Store};
|
|
use wasmtime_wasi::preview1::{self, WasiP1Ctx};
|
|
use wasmtime_wasi::WasiCtxBuilder;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
// Construct the wasm engine with async support enabled.
|
|
let mut config = Config::new();
|
|
config.async_support(true);
|
|
let engine = Engine::new(&config)?;
|
|
|
|
// Add the WASI preview1 API to the linker (will be implemented in terms of
|
|
// the preview2 API)
|
|
let mut linker: Linker<WasiP1Ctx> = Linker::new(&engine);
|
|
preview1::add_to_linker_async(&mut linker, |t| t)?;
|
|
|
|
// Add capabilities (e.g. filesystem access) to the WASI preview2 context
|
|
// here. Here only stdio is inherited, but see docs of `WasiCtxBuilder` for
|
|
// more.
|
|
let wasi_ctx = WasiCtxBuilder::new().inherit_stdio().build_p1();
|
|
|
|
let mut store = Store::new(&engine, wasi_ctx);
|
|
|
|
// Instantiate our 'Hello World' wasm module.
|
|
// Note: This is a module built against the preview1 WASI API.
|
|
let module = Module::from_file(&engine, "target/wasm32-wasip1/debug/wasi.wasm")?;
|
|
let func = linker
|
|
.module_async(&mut store, "", &module)
|
|
.await?
|
|
.get_default(&mut store, "")?
|
|
.typed::<(), ()>(&store)?;
|
|
|
|
// Invoke the WASI program default function.
|
|
func.call_async(&mut store, ()).await?;
|
|
|
|
Ok(())
|
|
}
|
|
|