From 57c53affe3542cb6bd4e79ee4c18f20a1bd76b2d Mon Sep 17 00:00:00 2001
From: 魏曹先生 <1992414357@qq.com>
Date: Mon, 17 Aug 2026 05:49:19 +0800
Subject: refactor!: replace pack! macros with derive-based pipeline types
Remove the `pack!`, `pack_err!`, `pack_structural!`, and
`pack_err_structural!` macros, replacing all pipeline type definitions
with `#[derive(Grouped)]` and `#[derive(Grouped, Wrap)]` attributes.
This changes the generated struct shape from named-field structs with an
`inner` field to tuple structs accessed via `.0`, and removes the
auto-generated `name` and `info` fields from error types.
---
CHANGELOG.md | 48 +++
GETTING-STARTED.md | 60 +--
README.md | 17 +-
docs/_zh_CN/pages/11-resource-system.md | 11 +-
docs/_zh_CN/pages/12-exit-code.md | 7 +-
docs/_zh_CN/pages/13-hook.md | 5 +-
docs/_zh_CN/pages/14-testing.md | 39 +-
docs/_zh_CN/pages/2-define-a-dispatcher.md | 10 +-
docs/_zh_CN/pages/3-define-a-chain.md | 54 ++-
docs/_zh_CN/pages/4-render-result.md | 35 +-
docs/_zh_CN/pages/5-multiple-commands.md | 20 +-
docs/_zh_CN/pages/6-argument-parse-picker.md | 64 +--
docs/_zh_CN/pages/9-error-handling.md | 40 +-
.../_zh_CN/pages/advanced/2-structural-renderer.md | 20 +-
docs/_zh_CN/pages/concepts/2-resource.md | 3 +-
docs/_zh_CN/pages/concepts/3-any-output.md | 6 +-
docs/_zh_CN/pages/concepts/4-program-collect.md | 2 +-
docs/_zh_CN/pages/other/features.md | 59 +--
docs/_zh_CN/pages/other/naming_rule.md | 25 +-
docs/example-pages/examples.json | 17 -
docs/pages/11-resource-system.md | 11 +-
docs/pages/12-exit-code.md | 3 +-
docs/pages/13-hook.md | 5 +-
docs/pages/14-testing.md | 39 +-
docs/pages/2-define-a-dispatcher.md | 10 +-
docs/pages/3-define-a-chain.md | 54 ++-
docs/pages/4-render-result.md | 35 +-
docs/pages/5-multiple-commands.md | 20 +-
docs/pages/6-argument-parse-picker.md | 64 +--
docs/pages/9-error-handling.md | 40 +-
docs/pages/advanced/2-structural-renderer.md | 20 +-
docs/pages/concepts/2-resource.md | 3 +-
docs/pages/concepts/3-any-output.md | 6 +-
docs/pages/concepts/4-program-collect.md | 2 +-
docs/pages/other/features.md | 59 +--
docs/pages/other/naming_rule.md | 24 +-
docs/res/changlog_examples/feat_program_res.rs | 5 +-
examples/example-argument-picker/src/main.rs | 69 ++--
examples/example-async-support/src/main.rs | 5 +-
examples/example-basic/src/main.rs | 25 +-
.../src/sub/mod.rs | 5 +-
.../example-combine-pathf-metadata/src/sub/mod.rs | 12 +-
examples/example-command-macro/src/main.rs | 13 +-
examples/example-completion/src/main.rs | 5 +-
examples/example-error-handling/src/main.rs | 31 +-
examples/example-exitcode/src/main.rs | 13 +-
examples/example-hook/src/main.rs | 5 +-
examples/example-lazy-resources/src/main.rs | 3 +-
examples/example-metadata/src/main.rs | 13 +-
examples/example-outside-type/src/main.rs | 7 +-
examples/example-pack-err/Cargo.lock | 235 -----------
examples/example-pack-err/Cargo.toml | 16 -
examples/example-pack-err/page.toml | 10 -
examples/example-pack-err/src/main.rs | 151 -------
examples/example-pack-err/test.toml | 35 --
examples/example-panic-unwind/src/main.rs | 6 +-
examples/example-pathfinder/src/sub/mod.rs | 6 +-
examples/example-repl-basic/src/main.rs | 26 +-
examples/example-setup/src/main.rs | 5 +-
examples/example-structural-renderer/src/main.rs | 5 +-
examples/example-unit-test/src/main.rs | 41 +-
examples/full-todolist/src/main.rs | 36 +-
mingling/src/docs/lib.md | 5 +-
mingling/src/example_docs.rs | 447 +++++++--------------
mingling/src/gen_program.rs | 12 +-
mingling/src/lib.rs | 21 +-
mingling_cli/src/config/cmd_cfg.rs | 35 +-
mingling_cli/src/lib.rs | 2 +-
mingling_cli/src/linter/cmd_explain.rs | 30 +-
mingling_cli/src/linter/cmd_lint.rs | 12 +-
mingling_cli/src/linter/mlint_report.rs | 21 +-
mingling_cli/src/metadata/cmd_metadata.rs | 7 +-
mingling_cli/src/pkg_mgr.rs | 21 +-
mingling_cli/src/pkg_mgr/cmd_install.rs | 43 +-
mingling_cli/src/pkg_mgr/cmd_internal_loadpkgs.rs | 22 +-
mingling_cli/src/pkg_mgr/cmd_pkg_disable.rs | 26 +-
mingling_cli/src/pkg_mgr/cmd_pkg_enable.rs | 27 +-
mingling_cli/src/pkg_mgr/cmd_pkg_show.rs | 11 +-
mingling_cli/src/pkg_mgr/cmd_uninstall.rs | 38 +-
mingling_cli/src/proj_mgr/cmd_class_add.rs | 61 +--
mingling_cli/src/proj_mgr/cmd_proj_init.rs | 82 ++--
mingling_macros/src/attr/dispatcher_clap.rs | 7 +-
mingling_macros/src/func.rs | 7 -
mingling_macros/src/func/dispatcher.rs | 10 +-
mingling_macros/src/func/entry.rs | 2 +-
mingling_macros/src/func/gen_program.rs | 3 +-
mingling_macros/src/func/pack.rs | 154 -------
mingling_macros/src/func/pack_err.rs | 108 -----
mingling_macros/src/func/pack_err_structural.rs | 121 ------
mingling_macros/src/func/pack_structural.rs | 170 --------
mingling_macros/src/func/program_comp_gen.rs | 15 +-
mingling_macros/src/func/program_fallback_gen.rs | 8 +-
mingling_macros/src/func/program_final_gen.rs | 4 +-
mingling_macros/src/lib.rs | 238 +++--------
mingling_macros/src/systems.rs | 5 +-
mingling_macros/src/systems/structural_data.rs | 7 -
mingling_pathf/src/pattern_analyzer.rs | 5 +-
mingling_pathf/src/patterns.rs | 2 -
mingling_pathf/src/patterns/pack.rs | 104 -----
mingling_pathf/test/src/lib.rs | 27 --
mingling_pathf/test/src/test_files/test_pack.rs | 17 -
101 files changed, 1229 insertions(+), 2428 deletions(-)
delete mode 100644 examples/example-pack-err/Cargo.lock
delete mode 100644 examples/example-pack-err/Cargo.toml
delete mode 100644 examples/example-pack-err/page.toml
delete mode 100644 examples/example-pack-err/src/main.rs
delete mode 100644 examples/example-pack-err/test.toml
delete mode 100644 mingling_macros/src/func/pack.rs
delete mode 100644 mingling_macros/src/func/pack_err.rs
delete mode 100644 mingling_macros/src/func/pack_err_structural.rs
delete mode 100644 mingling_macros/src/func/pack_structural.rs
delete mode 100644 mingling_macros/src/systems/structural_data.rs
delete mode 100644 mingling_pathf/src/patterns/pack.rs
delete mode 100644 mingling_pathf/test/src/test_files/test_pack.rs
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ea71a92..62b1f7d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -301,6 +301,54 @@ None
_Behavioral note:_ the `picked` values, flag parsing semantics, and the "longest registered prefix wins" matching rule are all preserved by the `picker` feature's `arg-picker` API. The removal is purely a dead-code cleanup: the legacy built-in parser has been fully superseded by `picker`, and downstream code must migrate to the new API names described above.
+5. **[`macros`]** **[BREAKING REMOVAL]** Removed the `pack!`, `pack_err!`, `pack_structural!`, and `pack_err_structural!` macros and replaced all pipeline type definitions with `#[derive(Grouped)]` (and, where applicable, `#[derive(Grouped, Wrap)]`) on user-defined structs.
+
+ ### What changed
+
+ The `pack!` family of macros — which generated a wrapper struct with a fixed `inner` field and a suite of trait impls (`From`/`Into`, `AsRef`/`AsMut`, `Deref`/`DerefMut`, conditional `Default`, `Grouped`, and `Into
Written by @Weicao-CatilGrass
diff --git a/docs/_zh_CN/pages/concepts/4-program-collect.md b/docs/_zh_CN/pages/concepts/4-program-collect.md
index a0236f6..616f645 100644
--- a/docs/_zh_CN/pages/concepts/4-program-collect.md
+++ b/docs/_zh_CN/pages/concepts/4-program-collect.md
@@ -9,7 +9,7 @@
### 1. 生成枚举
-扫描当前模块中所有 `pack!`、`#[chain]`、`#[renderer]` 等宏标记的类型,为每个类型生成一个枚举变体。
+扫描当前模块中所有 `#[derive(Grouped)]`、`#[chain]`、`#[renderer]` 等宏标记的类型,为每个类型生成一个枚举变体。
这个枚举就是 `AnyOutput Details
@@ -168,10 +168,13 @@ build_comp_scripts("myprogram").unwrap();
```rust
// Features: ["extras"]
-pack!(StatePrev1 = ());
-pack!(StatePrev2 = ());
+#[derive(Grouped, Wrap)]
+pub struct StatePrev1(());
+#[derive(Grouped, Wrap)]
+pub struct StatePrev2(());
-pack!(StateNext = ());
+#[derive(Grouped, Wrap)]
+pub struct StateNext(());
#[chain]
fn handle_state_prev2(_p: StatePrev2) {
@@ -186,7 +189,7 @@ fn handle_state_prev1(_p: StatePrev1) -> Next {
// 当需要 Next 且不需要返回值,便可以使用它
empty_result!()
} else {
- StateNext::new(()).into()
+ StateNext(()).into()
}
}
```
@@ -217,7 +220,8 @@ fn no_error_setup(program: &mut Program#[renderer] macro to output results.
Written by @Weicao-CatilGrass
diff --git a/docs/pages/concepts/4-program-collect.md b/docs/pages/concepts/4-program-collect.md
index c5203c3..bc1fbc9 100644
--- a/docs/pages/concepts/4-program-collect.md
+++ b/docs/pages/concepts/4-program-collect.md
@@ -9,7 +9,7 @@ Every Mingling program ends with a `gen_program!()` call. Behind the scenes, it
### 1. Generate an enum
-Scans the current module for all types marked with `pack!`, `#[chain]`, `#[renderer]` and similar macros, then generates an enum variant for each type.
+Scans the current module for all types marked with `#[derive(Grouped)]`, `#[chain]`, `#[renderer]` and similar macros, then generates an enum variant for each type.
This enum is the type of `G` in `AnyOutput Details
@@ -168,10 +168,13 @@ For example, allows the shorthand form `dispatcher!("greet")`, which auto-genera
```rust
// Features: ["extras"]
-pack!(StatePrev1 = ());
-pack!(StatePrev2 = ());
+#[derive(Grouped, Wrap)]
+pub struct StatePrev1(());
+#[derive(Grouped, Wrap)]
+pub struct StatePrev2(());
-pack!(StateNext = ());
+#[derive(Grouped, Wrap)]
+pub struct StateNext(());
#[chain]
fn handle_state_prev2(_p: StatePrev2) {
@@ -186,7 +189,7 @@ fn handle_state_prev1(_p: StatePrev1) -> Next {
// When Next is needed but no return value is required, use this
empty_result!()
} else {
- StateNext::new(()).into()
+ StateNext(()).into()
}
}
```
@@ -217,7 +220,8 @@ fn no_error_setup(program: &mut Program