wasmy 0.3.3

wasmy, easily customize my wasm app!
Documentation

wasmy WasmGroup-QQ42726807

wasmy, easily customize my wasm app!

features

  • Attribute macros implement automatic registration of handlers
  • ABI is loose, freely register handlers in vm or wasm
  • Completely shield vm-wasm interaction details
  • Use protobuf as the interaction protocol

crates

[dependencies]
wasmy-vm = "0.3.3"
[dependencies]
wasmy-abi = "0.3.3"
wasmy-macros = "0.3.3"

example

  • wasm code (target = "wasm32-wasi")
use rand::random;
use wasmy_abi::*;
use wasmy_abi::test::*;

#[wasm_handler(0)]
fn multiply(ctx: Ctx, args: TestArgs) -> Result<TestResult> {
    let rid = random::<u8>() as i32;
    println!("[Wasm-Simple({})] handle guest method({}) ctx={:?}, args={{{:?}}}", rid, 0, ctx, args);

    let mut host_args = TestArgs::new();
    host_args.a = rid;
    host_args.b = rid;
    let host_res: TestResult = ctx.call_host(0, &host_args)?;
    println!("[Wasm-Simple({})] call host method({}): args={{{:?}}}, result={}", rid, 0, host_res, host_res.get_c());

    let mut res = TestResult::new();
    res.set_c(args.a * args.b);
    Ok(res)
}
  • vm code
use wasmy_vm::*;
use crate::test::{TestArgs, TestResult};

...

fn main() {
    println!("wasmy, easily customize my wasm app!");
    ...
    let ins_key = load_wasm(wasm_path).unwrap();
    let mut data = TestArgs::new();
    data.set_a(2);
    data.set_b(5);
    let res: TestResult = call_wasm(ins_key.into_wasm_uri(), 0, data.clone()).unwrap();
    println!("{}+{}={}", data.get_a(), data.get_b(), res.get_c())
}

#[vm_handler(0)]
fn add(args: TestArgs) -> Result<TestResult> {
    let mut res = TestResult::new();
    res.set_c(args.a + args.b);
    Ok(res)
}

test simple example

  • raw cargo cmd:
$ rustup target add wasm32-wasi

$ cargo +nightly build --target=wasm32-wasi --example=simple
$ cargo +nightly run --example=vm -- ../../wasm32-wasi/debug/examples/simple.wasm
  • alias cargo cmd:
$ rustup target add wasm32-wasi

$ cargo +nightly wasm simple
$ cargo +nightly vm simple