From 4665fc94ab9508d115298dd988e2381354f46c01 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Tue, 14 Jul 2026 01:36:27 +0800 Subject: 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`. --- mingling_picker_macros/src/lib.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'mingling_picker_macros/src/lib.rs') 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) +} -- cgit