1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
use crate::{Element, Fragment, Node, SignalNode, SignalVecNode, Text}; use std::borrow::Cow; pub trait Component { fn into_node(self) -> Node; } impl<T> From<T> for Node where T: Component, { fn from(value: T) -> Self { value.into_node() } } impl Component for Text { fn into_node(self) -> Node { Node::Text(self) } } impl Component for Element { fn into_node(self) -> Node { Node::Element(self) } } impl Component for Fragment { fn into_node(self) -> Node { Node::Fragment(self) } } impl Component for SignalNode { fn into_node(self) -> Node { Node::Signal(self) } } impl Component for SignalVecNode { fn into_node(self) -> Node { Node::SignalVec(self) } } impl Component for Cow<'static, str> { fn into_node(self) -> Node { Node::Text(Text::new(self)) } } impl Component for String { fn into_node(self) -> Node { Node::Text(Text::new(self)) } } impl Component for &'static str { fn into_node(self) -> Node { Node::Text(Text::new(self)) } } impl<T> Component for Option<T> where T: Into<Node>, { fn into_node(self) -> Node { self.map(|s| s.into()) .unwrap_or_else(|| Node::Fragment(Fragment::new())) } } impl<T> Component for Vec<T> where T: Into<Node>, { fn into_node(self) -> Node { let mut fragment = Fragment::new(); for child in self { fragment = fragment.child(child.into()); } Node::Fragment(fragment) } }