aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src/lib.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-25 23:41:36 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-25 23:41:36 +0800
commit4ac7d7dc9e6abec2f3f84dd5baf8b642727f19c3 (patch)
treea36a182869f035e52ec7f6b7e64826d90869f438 /mingling_macros/src/lib.rs
parent7625655d474f6f12e04a11a067f87287badce9f2 (diff)
Add help system with `#[help]` macro and `HelpRequest` trait
Diffstat (limited to 'mingling_macros/src/lib.rs')
-rw-r--r--mingling_macros/src/lib.rs27
1 files changed, 27 insertions, 0 deletions
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index da3bf47..dbbc333 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -19,6 +19,7 @@ mod dispatcher;
mod dispatcher_clap;
mod enum_tag;
mod groupped;
+mod help;
mod node;
mod pack;
mod program_setup;
@@ -44,6 +45,8 @@ pub(crate) static CHAINS_EXIST: Lazy<Mutex<BTreeSet<String>>> =
Lazy::new(|| Mutex::new(BTreeSet::new()));
pub(crate) static RENDERERS_EXIST: Lazy<Mutex<BTreeSet<String>>> =
Lazy::new(|| Mutex::new(BTreeSet::new()));
+pub(crate) static HELP_REQUESTS: Lazy<Mutex<BTreeSet<String>>> =
+ Lazy::new(|| Mutex::new(BTreeSet::new()));
#[proc_macro]
pub fn node(input: TokenStream) -> TokenStream {
@@ -97,6 +100,16 @@ pub fn dispatcher_clap(attr: TokenStream, item: TokenStream) -> TokenStream {
dispatcher_clap::dispatcher_clap_attr(attr, item)
}
+#[proc_macro]
+pub fn register_help(input: TokenStream) -> TokenStream {
+ help::register_help(input)
+}
+
+#[proc_macro_attribute]
+pub fn help(_attr: TokenStream, item: TokenStream) -> TokenStream {
+ help::help_attr(item)
+}
+
#[proc_macro_derive(Groupped, attributes(group))]
pub fn derive_groupped(input: TokenStream) -> TokenStream {
groupped::derive_groupped(input)
@@ -308,6 +321,14 @@ pub fn program_final_gen(input: TokenStream) -> TokenStream {
#[cfg(not(feature = "comp"))]
let comp = quote! {};
+ let help_tokens: Vec<proc_macro2::TokenStream> = HELP_REQUESTS
+ .lock()
+ .unwrap()
+ .clone()
+ .iter()
+ .map(|s| syn::parse_str::<proc_macro2::TokenStream>(s).unwrap())
+ .collect();
+
let expanded = quote! {
#[derive(Debug, Default, PartialEq, Eq, Clone)]
#[repr(u32)]
@@ -340,6 +361,12 @@ pub fn program_final_gen(input: TokenStream) -> TokenStream {
::mingling::__dispatch_program_chains!(
#(#chain_tokens)*
);
+ fn render_help(any: ::mingling::AnyOutput<Self::Enum>, r: &mut ::mingling::RenderResult) {
+ match any.member_id {
+ #(#help_tokens)*
+ _ => (),
+ }
+ }
fn has_renderer(any: &::mingling::AnyOutput<Self::Enum>) -> bool {
match any.member_id {
#(#renderer_exist_tokens)*