use std::marker::PhantomData;
use include_doc::function_body;
use silkenweb_macros::cfg_browser;
use self::{
dry::{DryElement, DryNode, DryText},
hydro::{HydroElement, HydroNode, HydroText},
template::{TemplateElement, TemplateNode, TemplateText},
wet::{WetElement, WetNode, WetText},
};
pub(super) mod private;
mod dry;
mod hydro;
mod template;
mod wet;
pub trait Dom: private::Dom {}
pub trait InstantiableDom: Dom + private::InstantiableDom {}
pub trait InDom {
type Dom: Dom;
}
#[cfg_browser(true)]
pub type DefaultDom = Wet;
#[cfg_browser(false)]
pub type DefaultDom = Dry;
#[doc = function_body!("tests/doc/dom.rs", dry, [])]
pub struct Dry;
impl Dom for Dry {}
impl private::Dom for Dry {
type Element = DryElement;
type Node = DryNode;
type Text = DryText;
}
impl InstantiableDom for Dry {}
impl private::InstantiableDom for Dry {
type InstantiableElement = DryElement;
type InstantiableNode = DryNode;
}
#[doc = function_body!("tests/doc/dom.rs", hydro, [])]
pub struct Hydro;
impl Dom for Hydro {}
impl private::Dom for Hydro {
type Element = HydroElement;
type Node = HydroNode;
type Text = HydroText;
}
impl InstantiableDom for Hydro {}
impl private::InstantiableDom for Hydro {
type InstantiableElement = HydroElement;
type InstantiableNode = HydroNode;
}
#[doc = function_body!("tests/doc/dom.rs", wet, [])]
pub struct Wet;
impl Dom for Wet {}
impl private::Dom for Wet {
type Element = WetElement;
type Node = WetNode;
type Text = WetText;
}
impl InstantiableDom for Wet {}
impl private::InstantiableDom for Wet {
type InstantiableElement = WetElement;
type InstantiableNode = WetNode;
}
#[doc = function_body!("tests/doc/dom.rs", template, [])]
pub struct Template<Param, D: InstantiableDom = DefaultDom>(PhantomData<(Param, D)>);
impl<Param: 'static, D: InstantiableDom> Dom for Template<Param, D> {}
impl<Param: 'static, D: InstantiableDom> private::Dom for Template<Param, D> {
type Element = TemplateElement<Param, D>;
type Node = TemplateNode<Param, D>;
type Text = TemplateText<D>;
}