From 57f68899cd2200568c53201c6fd1ced85b613a3b Mon Sep 17 00:00:00 2001 From: Ashelyn Rose Date: Sat, 26 Apr 2025 15:05:04 -0600 Subject: macro handles components now --- modules/morgana_proc/src/lib.rs | 17 +++++++++++------ modules/site_test/src/main.rs | 34 ++++++++++++---------------------- 2 files changed, 23 insertions(+), 28 deletions(-) (limited to 'modules') 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::().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) -> Vec { + fn render(self: Box) -> RenderNode { morx!{ html lang = "en-US" { head { @@ -41,13 +35,9 @@ struct Child { } impl Component for Child { - fn render(self: Box) -> Vec { - vec![ - RenderNode::Element { - name: "p".to_string(), - attributes: HashMap::new(), - children: self.children - } - ] + fn render(self: Box) -> RenderNode { + morx! { + p= {self.children} + } } } -- cgit 1.4.1