wasm-webidl-bindings
Read, write, and manipulate the Wasm WebIDL bindings custom section.
A parser for the straw proposal text format. See crates/text-parser/src/grammar.lalrpop
.
A set of AST types for representing and manipulating WebIDL bindings. See
src/ast.rs
.
An encoder and decoder for the straw proposal binary format. See the
implementation at src/binary/encode.rs
and details on the format at
BINARY.md
.
```rust
use wasmwebidlbindings::{binary, text};
// Get the walrus::Module
that this webidl-bindings section is for.
//
// The Wasm type and func that are being bound are:
//
// (type $EncodeIntoFuncWasm
// (param anyref anyref i32 i32)
// (result i64 i64))
//
// (func $encodeInto
// (import "TextEncoder" "encodeInto")
// (type $EncodeIntoFuncWasm))
let rawwasm: Vec
let mut config = walrus::ModuleConfig::default();
// Register a function to run after the module is parsed, but with access to the // mapping from indices in the original Wasm binary to their newly assigned // walrus IDs. // // This is where we will parse the Web IDL bindings text. config.onparse(|module, indicestoids| { let webidlbindings = text::parse(module, indicestoids, r#" type $TextEncoderEncodeIntoResult (dict (field "read" unsigned long long) (field "written" unsigned long long))
type $EncodeIntoFuncWebIDL
(func (method any)
(param USVString Uint8Array)
(result $TextEncoderEncodeIntoResult))
func-binding $encodeIntoBinding import $EncodeIntoFuncWasm $EncodeIntoFuncWebIDL
(param
(as any 0)
(as any 1)
(view Int8Array 2 3))
(result
(as i64 (field 0 (get 0)))
(as i64 (field 1 (get 0))))
bind $encodeInto $encodeIntoBinding
"#)?;
println!("The parsed Web IDL bindings are {:#?}", webidl_bindings);
// Insert the `webidl_bindings` into the module as a custom section.
module.customs.add(webidl_bindings);
Ok(())
});
let mut module = config.parse(&raw_wasm)?;
// Reserialize the Wasm module along with its new Web IDL bindings // section. let newrawwasm = module.emit_wasm(); ```