diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-27 21:06:38 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-27 21:06:38 +0800 |
| commit | ad10b82c1e6785cbf88562117b1609905cfeb6dc (patch) | |
| tree | 5f7de552a570a4e0e3346e255a78d6687dfb6300 | |
| parent | 3fd6a7a27d7002cdf3ab5123b75c889d830e7145 (diff) | |
Add `route!` macro for early error routing
| -rw-r--r-- | CHANGELOG.md | 36 | ||||
| -rw-r--r-- | mingling/src/lib.rs | 2 | ||||
| -rw-r--r-- | mingling_macros/src/lib.rs | 12 |
3 files changed, 50 insertions, 0 deletions
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<ThisProgram> { + 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<ThisProgram> { + 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 @@ -59,6 +59,18 @@ pub fn pack(input: TokenStream) -> TokenStream { } #[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) } |
