1use std::rc::Rc;
2use yew::virtual_dom as vdom;
3
4pub struct Comp<'a, T>
6where
7 T: yew::BaseComponent,
8{
9 props: T::Properties,
10 key: Option<&'a str>,
11}
12
13impl<'a, T> Comp<'a, T>
14where
15 T: yew::BaseComponent,
16{
17 pub(crate) fn new(props: T::Properties) -> Self {
18 Self { props, key: None }
19 }
20
21 #[must_use]
22 pub fn key(mut self, key: &'a str) -> Self {
23 self.key = Some(key);
24 self
25 }
26
27 #[must_use]
28 pub fn to_vnode(self) -> vdom::VNode {
29 let key = self.key.map(|k| k.into());
30 let comp = vdom::VComp::new::<T>(Rc::new(self.props), key);
31 vdom::VNode::VComp(comp)
32 }
33}
34
35impl<'a, T> From<Comp<'a, T>> for vdom::VNode
36where
37 T: yew::BaseComponent,
38{
39 fn from(builder: Comp<T>) -> Self {
40 builder.to_vnode()
41 }
42}
43
44impl<'a, T> From<Comp<'a, T>> for yew::Children
45where
46 T: yew::BaseComponent,
47{
48 fn from(comp: Comp<T>) -> Self {
49 yew::Children::new([comp.into()].to_vec())
50 }
51}