Add an example #[wasmtime] Rust macro (#283)
This commit adds a `wasmtime-rust` crate to the `misc` folder next to the previously added Python extension. The intention is that this showcases loading a WebAssembly file natively in Rust and how with an attribute macro it can feel lightweight in terms of boilerplate. The macro itself is pretty non-featureful today beyond the bare bones to get anything working, but there's all sorts of possibilities like JIT-compiled entry stubs we could eventually do with all the type information!
This commit is contained in:
committed by
Till Schneidereit
parent
54dd085e27
commit
d1b1500d19
37
misc/wasmtime-rust/README.md
Normal file
37
misc/wasmtime-rust/README.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# `wasmtime-rust` - Using WebAssembly from Rust
|
||||
|
||||
This crate is intended to be an example of how to load WebAssembly files from a
|
||||
native Rust application. You can always use `wasmtime` and its family of crates
|
||||
directly, but the purpose of this crate is to provide an ergonomic macro:
|
||||
|
||||
```rust
|
||||
#[wasmtime_rust::wasmtime]
|
||||
trait WasmMarkdown {
|
||||
fn render(&mut self, input: &str) -> String;
|
||||
}
|
||||
|
||||
fn main() -> Result<(), failure::Error> {
|
||||
let mut markdown = WasmMarkdown::load_file("markdown.wasm")?;
|
||||
println!("{}", markdown.render("# Hello, Rust!"));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
```
|
||||
|
||||
The `wasmtime` macro defined in the `wasmtime-rust` crate is placed on a `trait`
|
||||
which includes the set of functionality which a wasm module should export. In
|
||||
this case we're expecting one `render` function which takes and returns a
|
||||
string.
|
||||
|
||||
The macro expands to a `struct` with all of the methods on the trait (they must
|
||||
all be `&mut self`) and one function called `load_file` to actually instantiate
|
||||
the module.
|
||||
|
||||
Note that this macro is still in early stages of development, so error messages
|
||||
aren't great yet and all functionality isn't supported yet.
|
||||
|
||||
## Missing features
|
||||
|
||||
Currently if the wasm module imports any symbols outside of the WASI namespace
|
||||
the module will not load. It's intended that support for this will be added soon
|
||||
though!
|
||||
Reference in New Issue
Block a user