Skip to main content

react_rs_elements/
component.rs

1use 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}