diff options
author | Ashelyn Rose <git@ashen.earth> | 2025-04-26 15:05:04 -0600 |
---|---|---|
committer | Ashelyn Rose <git@ashen.earth> | 2025-04-26 15:05:04 -0600 |
commit | 57f68899cd2200568c53201c6fd1ced85b613a3b (patch) | |
tree | 2e5eab21e377ff5833bccf8e9f05ac07729ad336 /modules/morgana_proc/src | |
parent | 9f29a187b2395c5d1d4039600917e642948ad26b (diff) |
macro handles components now
Diffstat (limited to 'modules/morgana_proc/src')
-rw-r--r-- | modules/morgana_proc/src/lib.rs | 17 |
1 files changed, 11 insertions, 6 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(), |