18 releases

Uses old Rust 2015

0.8.0 Jul 27, 2020
0.7.1 Mar 18, 2020
0.7.0 Sep 10, 2019
0.6.1 Jul 24, 2019
0.1.5 Feb 13, 2018

#71 in WebAssembly

Download history 1848/week @ 2021-01-16 2333/week @ 2021-01-23 2312/week @ 2021-01-30 2532/week @ 2021-02-06 2074/week @ 2021-02-13 2491/week @ 2021-02-20 2197/week @ 2021-02-27 2198/week @ 2021-03-06 2076/week @ 2021-03-13 2152/week @ 2021-03-20 2019/week @ 2021-03-27 2221/week @ 2021-04-03 2012/week @ 2021-04-10 2258/week @ 2021-04-17 1720/week @ 2021-04-24 1849/week @ 2021-05-01

8,976 downloads per month
Used in 51 crates (via wabt)

Apache-2.0

15MB
250K SLoC

WebAssembly 139K SLoC // 0.0% comments C++ 75K SLoC // 0.1% comments Python 20K SLoC // 0.3% comments JavaScript 9K SLoC // 0.1% comments Visual Studio Project 3K SLoC C 2.5K SLoC // 0.1% comments Automake 423 SLoC // 0.2% comments Shell 400 SLoC // 0.6% comments Rust 256 SLoC // 0.0% comments Visual Studio Solution 234 SLoC VB6 150 SLoC Xcode Config 33 SLoC // 0.7% comments Batch 7 SLoC // 0.7% comments

WABT bindings for Rust

crates.io docs.rs

Rust bindings for WABT.

Usage

Add this to your Cargo.toml:

[dependencies]
wabt = "0.9.0"

Use cases

Assemble a given program in WebAssembly text format (aka wat) and translate it into binary.

extern crate wabt;
use wabt::wat2wasm;

fn main() {
    assert_eq!(
        wat2wasm("(module)").unwrap(),
        &[
            0, 97, 115, 109, // \0ASM - magic
            1, 0, 0, 0       //  0x01 - version
        ]
    );
}

or disassemble a wasm binary into the text format.

extern crate wabt;
use wabt::wasm2wat;
fn main() {
    assert_eq!(
        wasm2wat(&[
            0, 97, 115, 109, // \0ASM - magic
            1, 0, 0, 0       //    01 - version
        ]),
        Ok("(module)\n".to_owned()),
    );
}

wabt can be also used for parsing the official testsuite scripts.

use wabt::script::{ScriptParser, Command, CommandKind, Action, Value};

let wast = r#"
;; Define anonymous module with function export named `sub`.
(module
  (func (export "sub") (param $x i32) (param $y i32) (result i32)
    ;; return x - y;
    (i32.sub
      (get_local $x) (get_local $y)
    )
  )
)

;; Assert that invoking export `sub` with parameters (8, 3)
;; should return 5.
(assert_return
  (invoke "sub"
    (i32.const 8) (i32.const 3)
  )
  (i32.const 5)
)
"#;

let mut parser = ScriptParser::<f32, f64>::from_str(wast)?;
while let Some(Command { kind, .. }) = parser.next()? {
    match kind {
        CommandKind::Module { module, name } => {
            // The module is declared as anonymous.
            assert_eq!(name, None);

            // Convert the module into the binary representation and check the magic number.
            let module_binary = module.into_vec();
            assert_eq!(&module_binary[0..4], &[0, 97, 115, 109]);
        }
        CommandKind::AssertReturn { action, expected } => {
            assert_eq!(action, Action::Invoke {
                module: None,
                field: "sub".to_string(),
                args: vec![
                    Value::I32(8),
                    Value::I32(3)
                ],
            });
            assert_eq!(expected, vec![Value::I32(5)]);
        },
        _ => panic!("there are no other commands apart from that defined above"),
    }
}

Alternatives

You might find wat or wast crate useful if you only want to parse .wat or .wast source. The advantage of using them is that they are implemented completely in Rust. Moreover, wast among other things allows you to add your own extensions to WebAssembly text format.

For print the text representation of a wasm binary, wasmprinter can work better for you, since it is implemented completely in Rust.

No runtime deps