diff options
Diffstat (limited to 'mingling_macros/src/lib.rs')
| -rw-r--r-- | mingling_macros/src/lib.rs | 35 |
1 files changed, 35 insertions, 0 deletions
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<Mutex<Vec<String>>> = + Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static PACKED_TYPES: Lazy<Mutex<Vec<String>>> = Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static CHAINS: Lazy<Mutex<Vec<String>>> = Lazy::new(|| Mutex::new(Vec::new())); pub(crate) static RENDERERS: Lazy<Mutex<Vec<String>>> = 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<proc_macro2::TokenStream> = packed_types .iter() .map(|s| syn::parse_str::<proc_macro2::TokenStream>(s).unwrap()) @@ -108,6 +120,28 @@ pub fn gen_program(input: TokenStream) -> TokenStream { .map(|s| syn::parse_str::<proc_macro2::TokenStream>(s).unwrap()) .collect(); + #[cfg(feature = "general_renderer")] + let general_renderer_tokens: Vec<proc_macro2::TokenStream> = general_renderers + .iter() + .map(|s| syn::parse_str::<proc_macro2::TokenStream>(s).unwrap()) + .collect(); + + #[cfg(feature = "general_renderer")] + let general_render = quote! { + fn general_render( + any: ::mingling::AnyOutput<Self::Enum>, + 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<String>); @@ -155,6 +189,7 @@ pub fn gen_program(input: TokenStream) -> TokenStream { _ => false } } + #general_render } impl #name { |
