Работа над минимальным прототипом / тестовой программой для работы с Dom с использованием Rust и wasm-bindgen
.
Создание элемента с помощью document.create_element(tag)
, который возвращает web_sys::Element
. Элемент приводится к указанному типу c, в зависимости от тега, например, web_sys::HtmlButtonElement
. Это работает и, кроме того, помещает небольшую оболочку, используемую для установки типа элемента, определяющего c сборщиков.
struct ElemSpec<T> {
html_tag : html_const::HtmlTag<'static>,
resource_type: std::marker::PhantomData<T>
}
impl<T : wasm_bindgen::JsCast> ElemSpec<T> {
fn build_element(&self) -> T {
let window = web_sys::window().expect("no global `window` exists");
let document = window.document().expect("should have a document on window");
let elem = document.create_element(&self.html_tag);
let elem = match elem {
Ok(e) => e,
Err(error) => {
panic!("Call to document.create_element failed with error: {:?}", error)
},
};
let result = wasm_bindgen::JsCast::dyn_into::<T>(elem);
let helement = match result {
Ok(e) => e,
Err(e) => {
panic!("Cast to specific Element failed tag:{}", &self.html_tag);
},
};
helement
}
}
const BUTTON_ELEM : ElemSpec<web_sys::HtmlButtonElement> =
ElemSpec{ html_tag: html_const::BUTTON, resource_type: std::marker::PhantomData};
Это работает, HtmlButtonElement
построен с:
let buttonElement = BUTTON_ELEM.build_element();
Теперь я ищу черту Bound, ограничивающую элементы, которые можно кастовать с web_sys::Element
. Например, HtmlSpanElement
, HtmlDivElement
, ..., HtmlButtonElement
.
Дополнительная или замена, связанная с wasm_bindgen::JsCast
в impl<T : wasm_bindgen::JsCast>
. Может ли это быть сделано?