Rust , Serdeの Serialize / Deserialize でjavascript変数を渡し、戻り値を取得 #Rust #Webassembly #javascript
■ 概要:
Rust Webassembly (以下 wasm) の、
javascriptから、変数を渡す方法等の例となります
■ 参考サイト様
https://rustwasm.github.io/wasm-bindgen/reference/arbitrary-data-with-serde.html
■ 環境
Rust
rustc 1.46.0
cargo 1.46.0
wasm-pack
■ コード例
Rust , lib.rs
https://gist.github.com/kuc-arc-f/88a33c67387eb55778a16fd86316436b
receive_example_from_js は、 JsValue を返し、JSから取得できました。
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize)]
pub struct Example {
pub field1: HashMap<u32, String>,
pub field2: Vec<Vec<f32>>,
pub field3: [f32; 4],
pub field4: String,
}
#[wasm_bindgen]
pub fn send_example_to_js() -> JsValue {
let mut field1 = HashMap::new();
field1.insert(0, String::from("ex"));
let example = Example {
field1,
field2: vec![vec![1., 2.], vec![3., 4.]],
field3: [1., 2., 3., 4.],
field4: "f4".to_string()
};
JsValue::from_serde(&example).unwrap()
}
#[wasm_bindgen]
pub fn receive_example_from_js(val: &JsValue, f4_val: &str) -> JsValue {
let mut example: Example = val.into_serde().unwrap();
example.field4 = String::from( f4_val) ;
console::log_1(&JsValue::from_str( &example.field4 ));
JsValue::from_serde(&example).unwrap()
}
・JS呼出し
・send_example_to_js ,wasm からobjectを取得
・receive_example_from_js、文字を渡し、構造体のメンバー更新し
戻り値を、再度取得できました。
let d = wasm.send_example_to_js();
console.log( d )
let d2 = wasm.receive_example_from_js(d, "f4-from-js")
console.log( d2 )
■ Cargo.toml
[dependencies]
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
serde = { version = "1.0", features = ["derive"] }