#wasm-edge #string #host #primitive #data #type

wasmedge-bindgen-host

Pass string, vec and primitive types from host to webassembly

7 unstable releases (3 breaking)

0.4.1 Nov 19, 2022
0.4.0 Jul 6, 2022
0.3.0 Jun 23, 2022
0.2.1 Jun 16, 2022
0.1.0 Apr 1, 2022

#612 in WebAssembly

MIT/Apache

16KB
484 lines

About

Let WebAssembly's exported function support more data types for its parameters and return values.

Example

Export Rust things to host program

See demo program in rust_bindgen_func.

use wasmedge_bindgen::*;
use wasmedge_bindgen_macro::*;

// Export a `say` function from Rust, that returns a hello message.
#[wasmedge_bindgen]
pub fn say(s: String) -> String {
	let r = String::from("hello ");
	return r + s.as_str();
}

Run with command will compile the above code to a WASM bytes file.

cargo build --target wasm32-wasi --release

Rust SDK

Use exported functions in Rust SDK.

Refer to the completed exmaple in rust-sdk-test


fn main() {
	....

    let vm = Vm::new(Some(config)).unwrap();
    let args: Vec<String> = env::args().collect();
    let wasm_path = Path::new(&args[1]);
    let module = Module::from_file(None, wasm_path).unwrap();
    let vm = vm.register_module(None, module).unwrap();
    let mut bg = Bindgen::new(vm);

    // create_line: string, string, string -> string (inputs are JSON stringified)
    let params = vec![
        Param::String("{\"x\":2.5,\"y\":7.8}"),
        Param::String("{\"x\":2.5,\"y\":5.8}"),
        Param::String("A thin red line"),
    ];
    match bg.run_wasm("create_line", params) {
        Ok(rv) => {
            println!(
                "Run bindgen -- create_line: {:?}",
                rv.unwrap().pop().unwrap().downcast::<String>().unwrap()
            );
        }
        Err(e) => {
            println!("Run bindgen -- create_line FAILED {:?}", e);
        }
    }

	...
}

Go SDK

Use exported Rust things from WasmEdge-go!

Refer to the completed example in bindgen_funcs.go

import (
	"github.com/second-state/WasmEdge-go/wasmedge"
	bindgen "github.com/second-state/wasmedge-bindgen/host/go"
)

func main() {
	.
	.
	.

	// Instantiate the bindgen and vm
	bg := bindgen.Instantiate(vm)

		/// say: string -> string
	res, _ := bg.Execute("say", "wasmedge-bindgen")
	fmt.Println("Run bindgen -- say:", res[0].(string))
}

Guide

Find all the data types you can use!

You can find how to call the exported function from go host here.

Dependencies

~2.6–6MB
~107K SLoC