如何确保将正确的 HTML 元素从 JavaScript 传递到我的 Rust 函数?
How do I ensure the right HTML element is passed from JavaScript to my Rust function?
如果我用 wasm_bindgen 创建一个接受 HtmlCanvasElement
的 Rust 函数,我如何确保它在到达 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
,它没有函数,因为我传递的是字符串实际的 canvas 元素。我希望它在我设置时失败,而不是在稍后尝试使用它时失败。
在 DOM 和 wasm_bindgen 中的 Rust 之间没有太多类型控制。 JavaScript 部分处理从 Rust 中看到的 JsValue
.
这意味着您必须自己进行检查转换(或让未来的库或框架为您完成)。
JsCast
trait 对此有所帮助。它可以让你这样写,例如:
#[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")),
}
}
如果我用 wasm_bindgen 创建一个接受 HtmlCanvasElement
的 Rust 函数,我如何确保它在到达 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
,它没有函数,因为我传递的是字符串实际的 canvas 元素。我希望它在我设置时失败,而不是在稍后尝试使用它时失败。
在 DOM 和 wasm_bindgen 中的 Rust 之间没有太多类型控制。 JavaScript 部分处理从 Rust 中看到的 JsValue
.
这意味着您必须自己进行检查转换(或让未来的库或框架为您完成)。
JsCast
trait 对此有所帮助。它可以让你这样写,例如:
#[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")),
}
}