From ad10b82c1e6785cbf88562117b1609905cfeb6dc Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Mon, 27 Apr 2026 21:06:38 +0800 Subject: Add `route!` macro for early error routing --- CHANGELOG.md | 36 ++++++++++++++++++++++++++++++++++++ mingling/src/lib.rs | 2 ++ mingling_macros/src/lib.rs | 12 ++++++++++++ 3 files changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7a2ec2..582cbdb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,42 @@ fn your_command_help(_prev: YourEntry) { } ``` +7. **\[macros\]** Added the `route!` macro, which allows quick error routing within the `chain!` function. Usage is as follows: + +```rust +// Before +#[chain] +fn parse(prev: PickEntry) -> mingling::ChainProcess { + let picker = Picker::new(prev.inner); + let pick_result = picker + .pick_or_route((), NoNameProvided::default().to_render()) + .unpack(); + + match pick_result { + Ok(name) => { + // use name here + } + Err(e) => { + // handle error route here + e + } + } +} + +// After +#[chain] +fn parse(prev: PickEntry) -> mingling::ChainProcess { + let picker = Picker::new(prev.inner); + let name: String = route! { + picker + .pick_or_route((), NoNameProvided::default().to_render()) + .unpack() + }; + + // use name here +} +``` + #### **BREAKING CHANGES**: 1. **\[macros\]** Removed macro `dispatcher_render!` from `mingling_macros` diff --git a/mingling/src/lib.rs b/mingling/src/lib.rs index 7496d9d..afc8e90 100644 --- a/mingling/src/lib.rs +++ b/mingling/src/lib.rs @@ -113,6 +113,8 @@ pub mod macros { pub use mingling_macros::register_type; /// Used to generate a struct implementing the `Renderer` trait via a method pub use mingling_macros::renderer; + /// Used to generate a route that either returns a successful result or early returns an error. + pub use mingling_macros::route; #[cfg(feature = "comp")] /// Used to generate suggestions pub use mingling_macros::suggest; diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs index f9be1de..cce5eeb 100644 --- a/mingling_macros/src/lib.rs +++ b/mingling_macros/src/lib.rs @@ -58,6 +58,18 @@ pub fn pack(input: TokenStream) -> TokenStream { pack::pack(input) } +#[proc_macro] +pub fn route(input: TokenStream) -> TokenStream { + let expr = parse_macro_input!(input as syn::Expr); + let expanded = quote! { + match #expr { + Ok(r) => r, + Err(e) => return e, + } + }; + TokenStream::from(expanded) +} + #[proc_macro] pub fn dispatcher(input: TokenStream) -> TokenStream { dispatcher::dispatcher(input) -- cgit