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"] }
​

この記事が気に入ったらサポートをしてみませんか?