Как убедиться, что правильный элемент HTML передан из JavaScript в мою функцию Rust? - PullRequest
1 голос
/ 01 октября 2019

Если я создаю функцию Rust с wasm_bindgen, которая принимает HtmlCanvasElement, как мне убедиться, что она перестала работать, когда она переходит на сторону Rust?

JavaScript:

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

Rust:

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, у него нет функций, потому что я передаюстрока вместо фактического элемента холста. Я хочу, чтобы он не работал, когда я его установил, а не позже, когда я попытаюсь его использовать.

1 Ответ

1 голос
/ 01 октября 2019

На границе между DOM и Rust в wasm_bindgen не так много контроля типов. Часть 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")),
    }
}
...