Clone in a terminal:
Commit a9079b3
Johan Mattsson - 2026-06-28T13:11:19+00:00
a9079b3bd1640eaba52e18140f38864101da7ae3johan.mattsson.m@gmail.com

Add global component store

Changed files (1)

Diff

diff --git a/src/init.rs b/src/init.rsindex 5f014c3..b12ee05 100644--- a/src/init.rs+++ b/src/init.rs@@ -36,33 +36,85 @@ pub fn component_impl(attr: pm::TokenStream, item: pm::TokenStream) -> pm::Token     };      let struct_name_ident = &component_struct_item.ident;++    let global_store = generate_component_store(struct_name_ident.clone());+     let create_html_component_fn_name = format!("createComponent{}", struct_name_ident);     let fn_create_ident = Ident::new(&create_html_component_fn_name, Span::call_site()); -    let component_rs_state_fn = format!("initComponentState{}", struct_name_ident);-    let component_rs_state_fn_ident = Ident::new(&component_rs_state_fn, Span::call_site());+    let component_rs_state_js_fn = format!("initComponentState{}", struct_name_ident);+    let component_rs_state_js_fn_ident = Ident::new(&component_rs_state_js_fn, Span::call_site());++    let component_rs_state_rs_fn = from_pascal_to_snake(component_rs_state_js_fn.as_str());+    let component_rs_state_rs_js_ident = Ident::new(&component_rs_state_rs_fn, Span::call_site()); -    let create_fn = generate_create_component_fn(+    let create_js_fn = generate_create_component_fn(         fn_create_ident,         tag_lit.clone(),-        component_rs_state_fn.as_str(),+        component_rs_state_js_fn.as_str(),     ); -    let rs_state_fn = generate_default_component_rs_fn(component_rs_state_fn_ident);+    let rs_state_init_fn = generate_default_component_rs_fn(+        component_rs_state_js_fn_ident,+        component_rs_state_rs_js_ident,+        struct_name_ident.clone(),+    );      let expanded = quote! {         #component_struct_item-        #rs_state_fn-        #create_fn+        #global_store+        #rs_state_init_fn+        #create_js_fn     };      expanded.into() } -fn generate_default_component_rs_fn(name: Ident) -> proc_macro2::TokenStream {+fn generate_component_store(struct_name: Ident) -> proc_macro2::TokenStream {+    // Generate:+    // pub static COUNTER_COMPONENTS: RwLock<Option<Vec<Counter>>> = RwLock::new(None);+    let store_name = from_pascal_to_snake(&struct_name.to_string()).to_uppercase() + "_COMPONENTS";+    let store_ident = Ident::new(&store_name, Span::call_site());++    let expanded = quote! {+        pub static #store_ident: std::sync::RwLock<Option<Vec<#struct_name>>> = std::sync::RwLock::new(None);+    };++    expanded+}++fn from_pascal_to_snake(fn_name: &str) -> String {+    let mut result = String::new();++    for (i, c) in fn_name.chars().enumerate() {+        if c.is_uppercase() {+            if i != 0 {+                result.push('_');+            }++            result.extend(c.to_lowercase());+        } else {+            result.push(c);+        }+    }++    result+}++fn generate_default_component_rs_fn(+    rust_name: Ident,+    js_name: Ident,+    struct_name: Ident,+) -> proc_macro2::TokenStream {     let expanded = quote! {+        #[callback(#js_name)] // initComponentStateStructName         #[allow(non_snake_case)]-        pub fn #name() { // initComponentStateStructName+        pub fn #rust_name() -> u32 {  // init_component_state_struct_name, returns id+            log!("Run counter init rs state.");+            let counter = #struct_name::default();+            //let mut counter_store = COUNTER_COMPONENTS.write().unwrap();+            //*counter_store = Some(counter);+            42         }     }; 

Contact

Email: johan.mattsson.m@gmail.com
Mastodon: typo.social/@birdfont
GitHub: johanmattssonm
LinkedIn: johan-mattsson-2ab324112