1use std::marker::PhantomData;
13
14use include_doc::function_body;
15use silkenweb_macros::cfg_browser;
16
17use self::{
18 dry::{DryElement, DryNode, DryText},
19 hydro::{HydroElement, HydroNode, HydroText},
20 template::{TemplateElement, TemplateNode, TemplateText},
21 wet::{WetElement, WetNode, WetText},
22};
23
24pub(super) mod private;
25
26mod dry;
27mod hydro;
28mod template;
29mod wet;
30
31pub trait Dom: private::Dom {}
35
36pub trait InstantiableDom: Dom + private::InstantiableDom {}
38
39pub trait InDom {
41 type Dom: Dom;
42}
43
44#[cfg_browser(true)]
45pub type DefaultDom = Wet;
47
48#[cfg_browser(false)]
49pub type DefaultDom = Dry;
51
52#[doc = function_body!("tests/doc/dom.rs", dry, [])]
61pub struct Dry;
63
64impl Dom for Dry {}
65
66impl private::Dom for Dry {
67 type Element = DryElement;
68 type Node = DryNode;
69 type Text = DryText;
70}
71
72impl InstantiableDom for Dry {}
73
74impl private::InstantiableDom for Dry {
75 type InstantiableElement = DryElement;
76 type InstantiableNode = DryNode;
77}
78
79#[doc = function_body!("tests/doc/dom.rs", hydro, [])]
89pub struct Hydro;
91
92impl Dom for Hydro {}
93
94impl private::Dom for Hydro {
95 type Element = HydroElement;
96 type Node = HydroNode;
97 type Text = HydroText;
98}
99
100impl InstantiableDom for Hydro {}
101
102impl private::InstantiableDom for Hydro {
103 type InstantiableElement = HydroElement;
104 type InstantiableNode = HydroNode;
105}
106
107#[doc = function_body!("tests/doc/dom.rs", wet, [])]
116pub struct Wet;
118
119impl Dom for Wet {}
120
121impl private::Dom for Wet {
122 type Element = WetElement;
123 type Node = WetNode;
124 type Text = WetText;
125}
126
127impl InstantiableDom for Wet {}
128
129impl private::InstantiableDom for Wet {
130 type InstantiableElement = WetElement;
131 type InstantiableNode = WetNode;
132}
133
134#[doc = function_body!("tests/doc/dom.rs", template, [])]
147pub struct Template<Param, D: InstantiableDom = DefaultDom>(PhantomData<(Param, D)>);
149
150impl<Param: 'static, D: InstantiableDom> Dom for Template<Param, D> {}
151
152impl<Param: 'static, D: InstantiableDom> private::Dom for Template<Param, D> {
153 type Element = TemplateElement<Param, D>;
154 type Node = TemplateNode<Param, D>;
155 type Text = TemplateText<D>;
156}