#wasm-bindgen #duck #interface #automatic #generate #macro

wasm_bindgen_duck_type

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

1个不稳定版本

0.1.0 2022年10月6日

#1331 in WebAssembly

MIT 协议

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