1 个不稳定版本

0.1.0 2022 年 10 月 6 日

#10 in #duck


wasm_bindgen_duck_type 中使用

MIT 许可证

4KB
63 代码行

wasm_bindgen_duck_type

使用 wasm_bindgen 自动生成 duck 类型接口的宏

为什么

对于大多数情况,应使用 Serde 来序列化和反序列化在 JavaScript 和 Rust 之间传递的对象。另外,如果 JavaScript 对象是类的实例,则不需要此包,因为可以重用类的实现。

然而,某些类型,如 web_sys::Element 或 js_sys::Function,不能作为文本序列化,因此此方法不可行。在这种情况下,当 JavaScript 对象未类型化 时,可以使用此宏提供类型化接口。

如何

此包根据给定的结构定义生成一个 Duck Typed 接口,以及一个 new 构造函数和 Default 特征实现。

用法

可以将 [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
}

lib.rs:

wasm_bindgen_duck_type 的实现

依赖关系

~1.5MB
~35K SLoC