1

如果我使用接受 a 的 wasm_bindgen 创建一个 Rust 函数,HtmlCanvasElement我如何确保它在到达 Rust 端时失败?

JavaScript:

(async () => {
    const demo = await import('./pkg/demo').catch(console.error);
    demo.setCanvas('Hello Element!');  
})();

锈:

use wasm_bindgen::prelude::*;
use web_sys::{console, HtmlCanvasElement};

#[wasm_bindgen]
pub fn setCanvas(canvas: &HtmlCanvasElement) {
    //  Why does this even get here? I didn't pass in an HtmlCanvasElement
    console::log_1(&canvas);
}

看起来我正在获取类型HtmlCanvasElement,但如果我尝试将其用作HtmlCanvasElement,它没有功能,因为我传递的是字符串而不是实际的画布元素。我希望它在设置时失败,而不是在以后尝试使用它时失败。

4

1 回答 1

1

wasm_bindgen 中 DOM 和 Rust 之间的边界没有太多类型控制。JavaScript 部分将 Rust 中看到的内容处理为JsValue.

这意味着您必须自己进行检查转换(或者让未来的库或框架为您完成)。

JsCast特征对此有所帮助。它可以让你写这个,例如:

#[wasm_bindgen]
pub fn setElement(canvas: JsValue) -> Result<(), JsValue> {
    match canvas.dyn_into::<HtmlCanvasElement>() {
        Ok(canvas) => {
            // ...

            Ok(())
        }
        Err(_) => Err(JsValue::from_str("argument not a HtmlCanvas")),
    }
}
于 2019-10-01T16:30:56.597 回答