43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
//! Example of instantiating of instantiating a wasm module which uses WASI
|
|
//! imports.
|
|
|
|
// You can execute this example with `cargo run --example wasi`
|
|
|
|
use anyhow::Result;
|
|
use wasmtime::*;
|
|
use wasmtime_wasi::sync::{Wasi, WasiCtxBuilder};
|
|
|
|
fn main() -> Result<()> {
|
|
tracing_subscriber::FmtSubscriber::builder()
|
|
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
|
|
.with_ansi(true)
|
|
.init();
|
|
|
|
// Define the WASI functions globally on the `Config`.
|
|
let mut config = Config::default();
|
|
Wasi::add_to_config(&mut config);
|
|
|
|
let store = Store::new(&Engine::new(&config)?);
|
|
|
|
// Set the WASI context in the store; all instances in the store share this context.
|
|
// `WasiCtxBuilder` provides a number of ways to configure what the target program
|
|
// will have access to.
|
|
assert!(Wasi::set_context(
|
|
&store,
|
|
WasiCtxBuilder::new()
|
|
.inherit_stdio()
|
|
.inherit_args()?
|
|
.build()?
|
|
)
|
|
.is_ok());
|
|
|
|
let mut linker = Linker::new(&store);
|
|
|
|
// Instantiate our module with the imports we've created, and run it.
|
|
let module = Module::from_file(store.engine(), "target/wasm32-wasi/debug/wasi.wasm")?;
|
|
linker.module("", &module)?;
|
|
linker.get_default("")?.typed::<(), ()>()?.call(())?;
|
|
|
|
Ok(())
|
|
}
|