summaryrefslogtreecommitdiff
path: root/mingling_macros/src/node.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-03-28 00:47:46 +0800
committer魏曹先生 <1992414357@qq.com>2026-03-28 00:47:46 +0800
commit7ce68cd11516bd7cf037ecea99a92aee7c31b2c3 (patch)
treea3923ad41c91aa21fe169fd6b4b1bf8898a82589 /mingling_macros/src/node.rs
Add initial Mingling framework codebase
Diffstat (limited to 'mingling_macros/src/node.rs')
-rw-r--r--mingling_macros/src/node.rs60
1 files changed, 60 insertions, 0 deletions
diff --git a/mingling_macros/src/node.rs b/mingling_macros/src/node.rs
new file mode 100644
index 0000000..3d9473f
--- /dev/null
+++ b/mingling_macros/src/node.rs
@@ -0,0 +1,60 @@
+//! Command Node Macro Implementation
+//!
+//! This module provides the `node` procedural macro for creating
+//! command nodes from dot-separated path strings.
+
+use just_fmt::kebab_case;
+use proc_macro::TokenStream;
+use proc_macro2::TokenStream as TokenStream2;
+use quote::quote;
+use syn::parse::{Parse, ParseStream};
+use syn::{LitStr, Result as SynResult};
+
+/// Parses a string literal input for the node macro
+struct NodeInput {
+ path: LitStr,
+}
+
+impl Parse for NodeInput {
+ fn parse(input: ParseStream) -> SynResult<Self> {
+ Ok(NodeInput {
+ path: input.parse()?,
+ })
+ }
+}
+
+/// Implementation of the `node` procedural macro
+///
+/// # Examples
+///
+/// ```ignore
+/// use mingling_macros::node;
+///
+/// // Creates: Node::default().join("root").join("subcommand").join("action")
+/// let node = node!("root.subcommand.action");
+/// ```
+pub fn node(input: TokenStream) -> TokenStream {
+ // Parse the input as a string literal
+ let input_parsed = syn::parse_macro_input!(input as NodeInput);
+ let path_str = input_parsed.path.value();
+
+ // Split the path by dots
+ let parts: Vec<String> = path_str
+ .split('.')
+ .map(|s| kebab_case!(s).to_string())
+ .collect();
+
+ // Build the expression starting from Node::default()
+ let mut expr: TokenStream2 = quote! {
+ mingling::Node::default()
+ };
+
+ // Add .join() calls for each part of the path
+ for part in parts {
+ expr = quote! {
+ #expr.join(#part)
+ };
+ }
+
+ expr.into()
+}