An open API service indexing awesome lists of open source software.

https://github.com/rustwasm/wasm-webidl-bindings

Read, write, and manipulate the Wasm WebIDL bindings custom section
https://github.com/rustwasm/wasm-webidl-bindings

Last synced: about 1 year ago
JSON representation

Read, write, and manipulate the Wasm WebIDL bindings custom section

Awesome Lists containing this project

README

          

# `wasm-webidl-bindings`

**Read, write, and manipulate the Wasm WebIDL bindings custom section.**

[![](https://docs.rs/wasm-webidl-bindings/badge.svg)](https://docs.rs/wasm-webidl-bindings/)
[![](https://img.shields.io/crates/v/wasm-webidl-bindings.svg)](https://crates.io/crates/wasm-webidl-bindings)
[![](https://img.shields.io/crates/d/wasm-webidl-bindings.svg)](https://crates.io/crates/wasm-webidl-bindings)

### What's Inside

* 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`.

### Example

#### Parsing the Text Format and Encoding it in the Binary Format

```rust
#[cfg(feature = "text")]
use wasm_webidl_bindings::{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 raw_wasm: Vec = get_wasm_buffer_from_somewhere();

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.on_parse(|module, indices_to_ids| {
let webidl_bindings = text::parse(module, indices_to_ids, 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 new_raw_wasm = module.emit_wasm();
```