summary refs log tree commit diff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/morgana_proc/src/lib.rs17
-rw-r--r--modules/site_test/src/main.rs34
2 files changed, 23 insertions, 28 deletions
diff --git a/modules/morgana_proc/src/lib.rs b/modules/morgana_proc/src/lib.rs
index 2f0c81b..8061b1b 100644
--- a/modules/morgana_proc/src/lib.rs
+++ b/modules/morgana_proc/src/lib.rs
@@ -25,7 +25,12 @@ pub fn morx(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
 
     let ast = tokens.to_token_iter().parse_all::<MorxBlock>().expect("syntax error");
 
-    generate_block(&ast).into()
+    let child_vec_expr = generate_block(&ast);
+    quote! {
+        RenderNode::Fragment {
+            children: #child_vec_expr
+        }
+    }.into()
 }
 
 fn generate_block(ast: &MorxBlock) -> unsynn::TokenStream {
@@ -46,7 +51,7 @@ fn generate_block(ast: &MorxBlock) -> unsynn::TokenStream {
 }
 
 fn generate_node(ast: &MorxNode) -> unsynn::TokenStream {
-    let elem_name = ast.0.first.to_string();
+    let elem_name = &ast.0.first;
     let attrs_or_props = match &ast.0.second {
         Either::Fourth(cons) => {
             let attrs = &cons.first;
@@ -98,19 +103,19 @@ fn generate_node(ast: &MorxNode) -> unsynn::TokenStream {
         _ => quote!{ vec![] }
     };
 
-    let is_component_node = elem_name.chars().next().map_or(false, |char| char.is_uppercase());
+    let is_component_node = elem_name.to_string().chars().next().map_or(false, |char| char.is_uppercase());
 
     if is_component_node {
         quote! {
             RenderNode::Component(
-                Box::new(#elem_name {
+                Box::new({ #elem_name {
                     #(#elem_props),*
                     children: #children
-                })
+                } })
             )
         }.into()
     } else {
-        let elem_name = Literal::string(&elem_name).into_token_stream();
+        let elem_name = Literal::string(&elem_name.to_string()).into_token_stream();
         quote! {
             RenderNode::Element {
                 name: #elem_name.to_string(),
diff --git a/modules/site_test/src/main.rs b/modules/site_test/src/main.rs
index ba40ede..9201c8a 100644
--- a/modules/site_test/src/main.rs
+++ b/modules/site_test/src/main.rs
@@ -1,21 +1,15 @@
-use std::collections::HashMap;
-
 use morgana::{morx, Component, RenderNode};
 
 pub fn main() {
-    let parent = ParentLayout {
-        children: vec![
-            RenderNode::Component(
-                Box::new(Child {
-                    children: vec![
-                        RenderNode::TextNode { content: "Hello world!".to_string() }
-                    ]
-                })
-            )
-        ]
+    let parent = morx! {
+        ParentLayout {
+            Child {
+                "Hello world!"
+            }
+        }
     };
 
-    let text = morgana::render_tree_blocking(RenderNode::Component(Box::new(parent)));
+    let text = morgana::render_tree_blocking(parent);
     println!("{text}")
 }
 
@@ -24,7 +18,7 @@ struct ParentLayout {
 }
 
 impl Component for ParentLayout {
-    fn render(self: Box<Self>) -> Vec<RenderNode> {
+    fn render(self: Box<Self>) -> RenderNode {
         morx!{
             html lang = "en-US" {
                 head {
@@ -41,13 +35,9 @@ struct Child {
 }
 
 impl Component for Child {
-    fn render(self: Box<Self>) -> Vec<RenderNode> {
-        vec![
-            RenderNode::Element {
-                name: "p".to_string(),
-                attributes: HashMap::new(),
-                children: self.children
-            }
-        ]
+    fn render(self: Box<Self>) -> RenderNode {
+        morx! {
+            p= {self.children}
+        }
     }
 }