Можно передать массив целых чисел, как это:
const js = import("./webassembly_rust");
let array_nums = [1,2,3,4,5,6,7,8,9];
js.then(js => {
js.test( array_nums );
});
в WebAssembly и сохранить его в векторе, как это:
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[macro_use]
extern crate serde_derive;
#[wasm_bindgen]
pub fn test(array: JsValue) {
let elements: Vec<u32> = array.into_serde().unwrap();
}
Также можно передать одинобъект, подобный этому:
const js = import("./webassembly_rust");
let jsObject = {name: "hello world", id: "99", parent_id: "11"};
js.then(js => {
js.test( jsObject );
});
в WebAssembly и сохраните его как Element
структуру, подобную этой:
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[macro_use]
extern crate serde_derive;
#[derive(Serialize, Deserialize)]
pub struct Element {
name: String,
id: String,
parent_id: String,
}
#[wasm_bindgen]
pub fn test(js_object: &JsValue) {
let element: Element = js_object.into_serde().unwrap();
}
Следующее, что я попробовал, это передать массив объектов, подобных этому:
const js = import("./webassembly_rust");
let arrayOfObjects = [
{name: "hello world", id: "99", parent_id: "88"},
{name: "hello world2", id: "88", parent_id: "12"},
{name: "hello world3", id: "77", parent_id: "88"}
]
js.then(js => {
js.test( arrayOfObjects );
});
в WebAssembly и сохраните его как вектор Element
, который выглядит следующим образом:
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[macro_use]
extern crate serde_derive;
#[derive(Serialize, Deserialize)]
pub struct Element {
name: String,
id: String,
parent_id: String,
}
#[wasm_bindgen]
pub fn test(js_objects: &JsValue) {
let elements: Vec<Element> = js_objects.into_serde().unwrap();
}
Это компилируется, но когда я запускаю этот код, я получаю ошибку:
func $__rust_start_panic (param i32) (result i32)
unreachable
unreachable
end
Передача массива объектов, заполненных числами, подобными этому:
const js = import("./webassembly_rust");
let arrayOfNumObjects = [
{name: 1, id: 2, parent_id: 3 },
{name: 1, id: 2, parent_id: 3 },
{name: 1, id: 2, parent_id: 3 }
]
js.then(js => {
js.test( arrayOfNumObjects );
});
в WebAssembly возможна, когда структура Element
содержит только u32
значения.
extern crate serde_json;
extern crate wasm_bindgen;
use wasm_bindgen::prelude::*;
#[macro_use]
extern crate serde_derive;
#[derive(Serialize, Deserialize)]
pub struct Element {
name: u32,
id: u32,
parent_id: u32,
}
#[wasm_bindgen]
pub fn test(js_objects: &JsValue) {
let elements: Vec<Element> = js_objects.into_serde().unwrap();
}
Похоже, проблема вызвана типом String
в структуре Element
.
Что я сделал не так?
Я нашел следующие статьи, но не могу найти в них решение моей проблемы:
Сериализация и десериализация произвольных данных в и из JsValue
с Serde
Здесь объясняется, как преобразовать объект JavaScript в структуру, но не как преобразовать массив объектов в вектор структур.
js_sys crate
Этот ящик позволяет использовать типы JavaScript, такие как массивы или объекты в Rust, но это не то, что мне нужно.Я хочу преобразовать значения JavaScript в их аналоги в Rust.Насколько я понимаю, в этом ящике можно использовать только встроенный JavaScript в Rust ... и это не так быстро, как при использовании только Rust.
github issue