aboutsummaryrefslogtreecommitdiff
path: root/mingling_picker_macros/src/lib.rs
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-07-14 01:36:27 +0800
committer魏曹先生 <1992414357@qq.com>2026-07-14 01:36:27 +0800
commit4665fc94ab9508d115298dd988e2381354f46c01 (patch)
treea2b14f5684c68d88a0a77570d0ac3ac8d863867b /mingling_picker_macros/src/lib.rs
parent5ac0f0e98d05e95f7e3c58995f8d79670cbac772 (diff)
feat(picker): add core trait, types, and builder macro for argument
parsing Implement the foundational `mingling_picker` library along with its companion `mingling_picker_macros` crate. The picker provides: - `Pickable` trait for parsing types from raw strings - `PickerResult` enum modeling parse outcomes - `Picker` struct for storing and indexing command-line arguments - `PickerRequirement` struct for declarative parameter definitions - `PickerPattern` family (1..32) of typed pattern structs via the `internal_repeat` proc macro - `req!` proc macro as a succinct builder for `PickerRequirement` Re-export `mingling_picker::macros::*` from the `mingling` crate when the `picker` feature is enabled, replacing the previous wildcard re-export of `mingling_macros`.
Diffstat (limited to 'mingling_picker_macros/src/lib.rs')
-rw-r--r--mingling_picker_macros/src/lib.rs29
1 files changed, 29 insertions, 0 deletions
diff --git a/mingling_picker_macros/src/lib.rs b/mingling_picker_macros/src/lib.rs
index 8b13789..a3c93eb 100644
--- a/mingling_picker_macros/src/lib.rs
+++ b/mingling_picker_macros/src/lib.rs
@@ -1 +1,30 @@
+use proc_macro::TokenStream;
+mod internal_repeat;
+mod req;
+
+/// Core proc-macro: repeats a template body `count` times.
+///
+/// Internal call signature: `internal_repeat!(count => { template })`
+#[proc_macro]
+pub fn internal_repeat(input: TokenStream) -> TokenStream {
+ internal_repeat::internal_repeat(input)
+}
+
+/// Quick builder for `PickerRequirement`.
+///
+/// # Syntax
+///
+/// ```ignore
+/// use mingling_picker_macros::req;
+///
+/// let basic = req![name: String];
+/// let with_short_name = req![name: String, 'n'];
+/// let with_short_alias = req![name: String, 'n', "alias"];
+/// let positional = req![String];
+/// let positional_with_name = req![String, 'n', "alias"];
+/// ```
+#[proc_macro]
+pub fn req(input: TokenStream) -> TokenStream {
+ req::req(input)
+}