From 5d91f0e9408e39afaa75f96b32c5ed7946a558f7 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 29 Mar 2026 14:06:50 +0800 Subject: Add fallback dispatcher for missing renderers. --- mingling_macros/src/lib.rs | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'mingling_macros/src/lib.rs') diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs index 26a7381..821743e 100644 --- a/mingling_macros/src/lib.rs +++ b/mingling_macros/src/lib.rs @@ -21,6 +21,8 @@ use std::sync::Mutex; // Global variable declarations for storing chain and renderer mappings pub(crate) static CHAINS: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static RENDERERS: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); +pub(crate) static CHAINS_EXIST: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); +pub(crate) static RENDERERS_EXIST: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); /// Creates a command node from a dot-separated path string. /// @@ -66,7 +68,7 @@ pub fn chain_struct(input: TokenStream) -> TokenStream { } #[proc_macro] -pub fn dispatcher_chain(input: TokenStream) -> TokenStream { +pub fn dispatcher(input: TokenStream) -> TokenStream { dispatcher_chain::dispatcher_chain(input) } @@ -207,6 +209,8 @@ pub fn program(input: TokenStream) -> TokenStream { let renderers = RENDERERS.lock().unwrap().clone(); let chains = CHAINS.lock().unwrap().clone(); + let renderer_exist = RENDERERS_EXIST.lock().unwrap().clone(); + let chain_exist = CHAINS_EXIST.lock().unwrap().clone(); let renderer_tokens: Vec = renderers .iter() @@ -218,6 +222,16 @@ pub fn program(input: TokenStream) -> TokenStream { .map(|s| syn::parse_str::(s).unwrap()) .collect(); + let renderer_exist_tokens: Vec = renderer_exist + .iter() + .map(|s| syn::parse_str::(s).unwrap()) + .collect(); + + let chain_exist_tokens: Vec = chain_exist + .iter() + .map(|s| syn::parse_str::(s).unwrap()) + .collect(); + let expanded = quote! { pub struct #name; @@ -228,6 +242,18 @@ pub fn program(input: TokenStream) -> TokenStream { ::mingling::__dispatch_program_chains!( #(#chain_tokens)* ); + fn has_renderer(any: &::mingling::AnyOutput) -> bool { + match any.type_id { + #(#renderer_exist_tokens)* + _ => false + } + } + fn has_chain(any: &::mingling::AnyOutput) -> bool { + match any.type_id { + #(#chain_exist_tokens)* + _ => false + } + } } impl #name { -- cgit