filesystem example (#2236)
This commit is contained in:
46
examples/wasi-fs/main.rs
Normal file
46
examples/wasi-fs/main.rs
Normal file
@@ -0,0 +1,46 @@
|
||||
//! Example of running a wasi binary in a memory filesystem
|
||||
|
||||
// The corresponding wasm binary can be built with:
|
||||
// `cargo build -p example-wasi-fs-wasm --target wasm32-wasi`
|
||||
//
|
||||
// then you can execute this example with `cargo run --example wasi-fs`
|
||||
|
||||
use anyhow::Result;
|
||||
use std::collections::HashMap;
|
||||
use wasmtime::*;
|
||||
use wasmtime_wasi::virtfs::{VecFileContents, VirtualDirEntry};
|
||||
use wasmtime_wasi::{Wasi, WasiCtxBuilder};
|
||||
|
||||
fn main() -> Result<()> {
|
||||
tracing_subscriber::FmtSubscriber::builder()
|
||||
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
|
||||
.with_ansi(true)
|
||||
.init();
|
||||
|
||||
let store = Store::default();
|
||||
let mut linker = Linker::new(&store);
|
||||
|
||||
// Create an instance of `Wasi` which contains a `WasiCtx`. Note that
|
||||
// `WasiCtx` provides a number of ways to configure what the target program
|
||||
// will have access to.
|
||||
let entry = VirtualDirEntry::File(Box::new(VecFileContents::with_content(
|
||||
"world".as_bytes().to_owned(),
|
||||
)));
|
||||
let mut map = HashMap::new();
|
||||
map.insert("test.txt".to_string(), entry);
|
||||
let dir = VirtualDirEntry::Directory(map);
|
||||
let ctx = WasiCtxBuilder::new()
|
||||
.inherit_stdout()
|
||||
.inherit_stderr()
|
||||
.preopened_virt(dir, ".")
|
||||
.build()?;
|
||||
let wasi = Wasi::new(&store, ctx);
|
||||
wasi.add_to_linker(&mut linker)?;
|
||||
|
||||
// Instantiate our module with the imports we've created, and run it.
|
||||
let module = Module::from_file(store.engine(), "target/wasm32-wasi/debug/wasi-fs.wasm")?;
|
||||
linker.module("", &module)?;
|
||||
linker.get_default("")?.get0::<()>()?()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user