24 releases

0.9.2 Sep 10, 2019
0.9.0 Jul 24, 2019
0.7.4 Jan 14, 2019
0.7.3 Dec 18, 2018
0.2.2 Mar 11, 2018

#10 in WebAssembly

Download history 2859/week @ 2019-05-28 2912/week @ 2019-06-04 2791/week @ 2019-06-11 4351/week @ 2019-06-18 4578/week @ 2019-06-25 2475/week @ 2019-07-02 2213/week @ 2019-07-09 1312/week @ 2019-07-16 1889/week @ 2019-07-23 3154/week @ 2019-07-30 3657/week @ 2019-08-06 2879/week @ 2019-08-13 3594/week @ 2019-08-20 3792/week @ 2019-08-27 4856/week @ 2019-09-03

13,732 downloads per month
Used in 35 crates (30 directly)

Apache-2.0

10MB
171K SLoC

WebAssembly 68K SLoC // 0.0% comments C++ 67K SLoC // 0.1% comments Python 20K SLoC // 0.3% comments JavaScript 9K SLoC // 0.1% comments Visual Studio Project 3K SLoC Rust 1.5K SLoC // 0.2% comments C 634 SLoC // 0.1% comments Automake 422 SLoC // 0.2% comments Shell 379 SLoC // 0.6% comments Visual Studio Solution 233 SLoC VB6 149 SLoC Xcode Config 32 SLoC // 0.7% comments Batch 6 SLoC // 0.7% comments

WABT bindings for Rust

crates.io docs.rs

Rust bindings for WABT. Work in progress.

Usage

Add this to your Cargo.toml:

[dependencies]
wabt = "0.9.0"

Example

wat2wasm (previously known as wast2wasm):

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
        ]
    );
}

wasm2wat:

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::from_str(wast)?;
while let Some(Command { kind, .. }) = parser.next()? { 
    match kind {
        CommandKind::Module { module, name } => {
            // The module is declared as annonymous.
            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"),
    }
}

Dependencies