From b6876f9df6e3119331fac01c0bc954ca9f3c798b Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 5 Apr 2026 20:33:57 +0800 Subject: Add general renderer support with serialization formats --- mingling_macros/src/lib.rs | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) (limited to 'mingling_macros/src/lib.rs') diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs index 5a32075..9513875 100644 --- a/mingling_macros/src/lib.rs +++ b/mingling_macros/src/lib.rs @@ -12,6 +12,7 @@ mod chain; mod dispatcher_chain; mod node; mod pack; +mod program_setup; mod render; mod renderer; @@ -19,6 +20,9 @@ use once_cell::sync::Lazy; use std::sync::Mutex; // Global variable declarations for storing chain and renderer mappings +#[cfg(feature = "general_renderer")] +pub(crate) static GENERAL_RENDERERS: Lazy>> = + Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static PACKED_TYPES: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static CHAINS: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static RENDERERS: Lazy>> = Lazy::new(|| Mutex::new(Vec::new())); @@ -65,6 +69,11 @@ pub fn renderer(_attr: TokenStream, item: TokenStream) -> TokenStream { renderer::renderer_attr(item) } +#[proc_macro_attribute] +pub fn program_setup(attr: TokenStream, item: TokenStream) -> TokenStream { + program_setup::setup_attr(attr, item) +} + #[proc_macro] pub fn gen_program(input: TokenStream) -> TokenStream { let name = if input.is_empty() { @@ -83,6 +92,9 @@ pub fn gen_program(input: TokenStream) -> TokenStream { let renderer_exist = RENDERERS_EXIST.lock().unwrap().clone(); let chain_exist = CHAINS_EXIST.lock().unwrap().clone(); + #[cfg(feature = "general_renderer")] + let general_renderers = GENERAL_RENDERERS.lock().unwrap().clone(); + let packed_types: Vec = packed_types .iter() .map(|s| syn::parse_str::(s).unwrap()) @@ -108,6 +120,28 @@ pub fn gen_program(input: TokenStream) -> TokenStream { .map(|s| syn::parse_str::(s).unwrap()) .collect(); + #[cfg(feature = "general_renderer")] + let general_renderer_tokens: Vec = general_renderers + .iter() + .map(|s| syn::parse_str::(s).unwrap()) + .collect(); + + #[cfg(feature = "general_renderer")] + let general_render = quote! { + fn general_render( + any: ::mingling::AnyOutput, + setting: &::mingling::GeneralRendererSetting, + ) -> Result<::mingling::RenderResult, ::mingling::error::GeneralRendererSerializeError> { + match any.member_id { + #(#general_renderer_tokens)* + _ => Ok(::mingling::RenderResult::default()), + } + } + }; + + #[cfg(not(feature = "general_renderer"))] + let general_render = quote! {}; + let expanded = quote! { ::mingling::macros::pack!(#name, RendererNotFound = String); ::mingling::macros::pack!(#name, DispatcherNotFound = Vec); @@ -155,6 +189,7 @@ pub fn gen_program(input: TokenStream) -> TokenStream { _ => false } } + #general_render } impl #name { -- cgit