react_rs_elements/
component.rs1use crate::node::Node;
2
3pub trait Component {
4 type Props;
5 fn render(props: Self::Props) -> Node;
6}
7
8pub fn component<P, F>(props: P, render: F) -> Node
9where
10 F: FnOnce(P) -> Node,
11{
12 render(props)
13}
14
15#[cfg(test)]
16mod tests {
17 use super::*;
18 use crate::html;
19 use crate::node::IntoNode;
20
21 struct Greeting;
22
23 impl Component for Greeting {
24 type Props = String;
25 fn render(name: String) -> Node {
26 html::div().text(format!("Hello, {}!", name)).into_node()
27 }
28 }
29
30 #[test]
31 fn test_component_trait() {
32 let node = Greeting::render("World".to_string());
33 match node {
34 Node::Element(el) => assert_eq!(el.tag(), "div"),
35 _ => panic!("Expected Element node"),
36 }
37 }
38
39 #[test]
40 fn test_component_helper() {
41 let node = component("Rust", |name: &str| {
42 html::h1().text(format!("Hello, {}!", name)).into_node()
43 });
44 match node {
45 Node::Element(el) => assert_eq!(el.tag(), "h1"),
46 _ => panic!("Expected Element node"),
47 }
48 }
49}