summaryrefslogtreecommitdiff
path: root/mingling_macros/src/lib.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-05 20:33:57 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-05 20:33:57 +0800
commitb6876f9df6e3119331fac01c0bc954ca9f3c798b (patch)
tree030301c8d434d51fa386e9a5fff77bce5899733b /mingling_macros/src/lib.rs
parentb41e201e554c4ba5ad6f1e09ce58dd3d10b6a635 (diff)
Add general renderer support with serialization formats
Diffstat (limited to 'mingling_macros/src/lib.rs')
-rw-r--r--mingling_macros/src/lib.rs35
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 {