1个不稳定版本
0.1.0 | 2022年10月6日 |
---|
#1331 in WebAssembly
6KB
wasm_bindgen_duck_type
宏,用于自动生成wasm_bindgen的duck类型接口
为什么
在大多数情况下,应使用Serde来序列化和反序列化在JavaScript和Rust之间传递的对象。此外,如果JavaScript对象是类的实例,则不需要此crate,因为可以重用类的实现。
然而,一些类型,如web_sys::Element或js_sys::Function,无法作为文本序列化,因此这种方法将不起作用。在这些情况下,可以使用此宏为未类型化的JavaScript对象提供类型化接口。
如何
此crate根据给定的结构体定义生成Duck Typed接口,以及一个new
构造函数和Default
trait实现。
使用方法
可以将[wasm_bindgen_duck_type]
属性宏应用于结构体以生成结构的duck类型接口。
示例
JavaScript
function MyFun() {
return {
number: 20,
fun: () => {
console.log("Hello, World!")
}
};
}
function GetNumber(input) {
return input.number
}
Rust
use wasm_bindgen_duck_type::wasm_bindgen_duck_type;
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
extern "C" {
fn MyFun() -> MyType;
fn GetNumber(input: MyType) -> i32;
}
#[wasm_bindgen_duck_type]
struct MyType {
number: i32,
fun: js_sys::Function,
}
fn main() {
let result = MyFun();
result.fun().call0(&JsValue::NULL);
result.set_number(10);
let input = MyType::default(); // All fields are null / default
let input = MyType::new(
42,
JsValue::NULL.into() // Pass a function
);
let num = GetNumber(input); // 42
}
依赖关系
~1–1.6MB
~30K SLoC