use super::concrete::ConcreteNodeArc;
use crate::internal_prelude::*;
use crate::node::concrete::ElementNodeArc;
use crate::sandbox::Builder;
use crate::window::Window;
macro_rules! declare_elements {
($($tag:literal => $name:ident),*) => {
paste::paste! {
#[derive(Clone)]
pub enum ElementNodeStorage {
$(
#[doc = "[" $tag "](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/" $tag ")"]
$name([<$name ElementStorage>]),
)*
}
}
};
}
declare_elements! {
"HTML" => HtmlHtml,
"BODY" => HtmlBody,
"BUTTON" => HtmlButton
}
#[derive(Clone)]
pub struct HtmlHtmlElementStorage {
pub default_view: Weak<Window>,
}
#[derive(Clone)]
pub struct HtmlBodyElementStorage;
#[derive(Clone)]
pub struct HtmlButtonElementStorage;
impl Builder<ElementNodeArc> {
pub fn build_html(&self, default_view: Weak<Window>) -> ConcreteNodeArc<ElementNodeStorage> {
ConcreteNodeArc::<ElementNodeStorage>::new(
self.sandbox.clone(),
Arc::new(ElementNodeStorage::HtmlHtml(HtmlHtmlElementStorage {
default_view,
})),
)
}
pub fn build_body(&self) -> ConcreteNodeArc<ElementNodeStorage> {
ConcreteNodeArc::<ElementNodeStorage>::new(
self.sandbox.clone(),
Arc::new(ElementNodeStorage::HtmlBody(HtmlBodyElementStorage)),
)
}
pub fn build_button(&self) -> ConcreteNodeArc<ElementNodeStorage> {
ConcreteNodeArc::<ElementNodeStorage>::new(
self.sandbox.clone(),
Arc::new(ElementNodeStorage::HtmlButton(HtmlButtonElementStorage)),
)
}
}