aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-04-27 21:06:38 +0800
committer魏曹先生 <1992414357@qq.com>2026-04-27 21:06:38 +0800
commitad10b82c1e6785cbf88562117b1609905cfeb6dc (patch)
tree5f7de552a570a4e0e3346e255a78d6687dfb6300
parent3fd6a7a27d7002cdf3ab5123b75c889d830e7145 (diff)
Add `route!` macro for early error routing
-rw-r--r--CHANGELOG.md36
-rw-r--r--mingling/src/lib.rs2
-rw-r--r--mingling_macros/src/lib.rs12
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)
}