aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2026-05-17 22:30:50 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2026-05-17 22:38:39 +0800
commitf27f5aeb09616b932ab48f0905994879dd8bafe5 (patch)
tree2deea67f7ed910ad824fbcce2330ab5c475e51a0
parentbdd736ad9899aed74aaa2760c6e068dcae0e6925 (diff)
Rename `NextProcess` to `Next` across the codebase
-rw-r--r--CHANGELOG.md23
-rw-r--r--README.md2
-rw-r--r--docs/_zh_CN/pages/1-creating-your-first-program.md12
-rw-r--r--docs/_zh_CN/pages/2-implementing-fallbacks.md2
-rw-r--r--docs/_zh_CN/pages/3-parsing-complex-arguments.md14
-rw-r--r--docs/pages/1-creating-your-first-program.md12
-rw-r--r--docs/pages/2-implementing-fallbacks.md2
-rw-r--r--docs/pages/3-parsing-complex-arguments.md14
-rw-r--r--examples/example-async/src/main.rs4
-rw-r--r--examples/example-basic/src/main.rs2
-rw-r--r--examples/example-completion/src/main.rs4
-rw-r--r--examples/example-exit-code/src/main.rs2
-rw-r--r--examples/example-general-renderer/src/main.rs4
-rw-r--r--examples/example-picker/src/main.rs2
-rw-r--r--examples/example-resources/src/main.rs4
-rw-r--r--mingling/README.md2
-rw-r--r--mingling/src/example_docs.rs22
-rw-r--r--mingling_core/src/any.rs20
-rw-r--r--mingling_core/src/program/exec.rs10
-rw-r--r--mingling_core/src/tester/chain_process_tester.rs4
-rw-r--r--mingling_macros/src/chain.rs17
-rw-r--r--mingling_macros/src/lib.rs30
-rw-r--r--mling/src/cli/install.rs2
-rw-r--r--mling/src/cli/list.rs4
-rw-r--r--mling/src/cli/namespace_mgr.rs8
-rw-r--r--mling/src/cli/read.rs6
26 files changed, 122 insertions, 106 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 044e7d1..cce00fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,7 +21,7 @@ None
```rust
#[chain]
-fn process(prev: HelloEntry, age: &Age, name: &Name) -> NextProcess {
+fn process(prev: HelloEntry, age: &Age, name: &Name) -> Next {
// age and name are automatically injected from global resources
}
```
@@ -44,7 +44,7 @@ fn proc(prev: HelloEntry) -> ChainProcess<ThisProgram> {
```rust
#[chain]
-pub fn handle_some_entry(_prev: SomeEntry, exit: &mut ExitCode) -> NextProcess {
+pub fn handle_some_entry(_prev: SomeEntry, exit: &mut ExitCode) -> Next {
exit.exit_code = 2;
Empty::default()
}
@@ -82,7 +82,7 @@ if mingling::feature::MINGLING_ASYNC {
```rust
#[chain]
-fn your_chain(_prev: Prev) -> NextProcess {
+fn your_chain(_prev: Prev) -> Next {
// Use `modify_res` to modify the value of `ExitCode`
this::<ThisProgram>().modify_res(|r: &mut ExitCode| r.exit_code = 1);
@@ -124,6 +124,23 @@ this::<ThisProgram>().modify_res::<ExitCode>(|code| {
use crate::ThisProgram; // Can be removed if not used directly
```
+3. **\[core\]** **\[macros\]** Replace `NextProcess` placeholder with `Next`
+
+```rust
+// Before
+#[chain]
+fn your_chain(_prev: Prev) -> NextProcess {
+ // ...
+}
+
+// After
+#[chain]
+fn your_chain(_prev: Prev) -> Next {
+ // ...
+}
+
+```
+
---
### Release 0.1.7 (2026-05-04)
diff --git a/README.md b/README.md
index c20955a..749c597 100644
--- a/README.md
+++ b/README.md
@@ -168,7 +168,7 @@ fn comp_greet_command(ctx: &ShellContext) -> Suggest {
// Define chain, parsing `GreetEntry` into `StateGreeting`
#[chain]
-fn parse_name_to_greet(prev: GreetEntry) -> NextProcess {
+fn parse_name_to_greet(prev: GreetEntry) -> Next {
let state_greeting: StateGreeting =
prev.pick_or::<String>((), "World").unpack().into();
state_greeting
diff --git a/docs/_zh_CN/pages/1-creating-your-first-program.md b/docs/_zh_CN/pages/1-creating-your-first-program.md
index ae0fef5..efb9997 100644
--- a/docs/_zh_CN/pages/1-creating-your-first-program.md
+++ b/docs/_zh_CN/pages/1-creating-your-first-program.md
@@ -163,7 +163,7 @@ dispatcher!("greet", GreetCommand => GreetEntry);
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args
.first()
@@ -185,15 +185,15 @@ fn render_greet_someone(prev: ResultGreetSomeone) {
这样我们就在原本的 `Dispatcher` 和 `Renderer` 中间插入了一个 `Chain`:它可以将用户输入的参数提取出来(或回退到默认值 "World"),再交由渲染器打印到终端。
-##### 关于 `NextProcess` 💡
+##### 关于 `Next` 💡
- `NextProcess` 是由 `gen_program!()` 生成的占位符,在 `#[chain]` 展开后,它将被替换为调度器能识别的类型擦除类型 `ChainProcess<ThisProgram>`,用于减少代码量
+ `Next` 是由 `gen_program!()` 生成的占位符,在 `#[chain]` 展开后,它将被替换为调度器能识别的类型擦除类型 `ChainProcess<ThisProgram>`,用于减少代码量
> [!NOTE]
>
-> `NextProcess` 方案为临时替代,下一次更新需要等待 Rust 的 `Impl In Type Aliases` 特性稳定后。
+> `Next` 方案为临时替代,下一次更新需要等待 Rust 的 `Impl In Type Aliases` 特性稳定后。
>
-> **不过,您不用担心**:下一次 `NextProcess` 的更新不会引入 **破坏性变更!**
+> **不过,您不用担心**:下一次 `Next` 的更新不会引入 **破坏性变更!**
##### 关于 `pack!` 💡
@@ -227,7 +227,7 @@ dispatcher!("greet", GreetCommand => GreetEntry);
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
diff --git a/docs/_zh_CN/pages/2-implementing-fallbacks.md b/docs/_zh_CN/pages/2-implementing-fallbacks.md
index e4fd3f8..b57a9e7 100644
--- a/docs/_zh_CN/pages/2-implementing-fallbacks.md
+++ b/docs/_zh_CN/pages/2-implementing-fallbacks.md
@@ -97,7 +97,7 @@ fn main() {
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
diff --git a/docs/_zh_CN/pages/3-parsing-complex-arguments.md b/docs/_zh_CN/pages/3-parsing-complex-arguments.md
index 4ee9cec..1fe78da 100644
--- a/docs/_zh_CN/pages/3-parsing-complex-arguments.md
+++ b/docs/_zh_CN/pages/3-parsing-complex-arguments.md
@@ -29,7 +29,7 @@ mingling = {
```rust
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
// 前文中使用的方式:
// let args = prev.inner;
// let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
@@ -118,7 +118,7 @@ pack!(ResultGreetSomeone = String);
pack!(ErrorGreetNoNameProvided = ());
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
// 使用 `pick_or_route` 提取 `--name` 参数
// 如果不存在或解析失败,则路由到 ErrorGreetNoNameProvided
let pick_result = prev
@@ -167,7 +167,7 @@ let name = match pick_result {
```rust
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let name = prev
.pick_or(["--name", "-n"], "World")
// 在提取出 `--name` 后,立刻对其进行格式化
@@ -192,7 +192,7 @@ pack!(ResultGreetSomeone = String);
pack!(ErrorGreetNameTooLong = usize);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let pick_result = prev
.pick_or(["--name", "-n"], "World")
// 和 `after` 不同,此处传入的是 &String
@@ -244,7 +244,7 @@ fn render_greet_someone(prev: ResultGreetSomeone) {
```rust
#[chain]
-fn handle_some_entry(prev: SomeEntry) -> NextProcess {
+fn handle_some_entry(prev: SomeEntry) -> Next {
let confirmed: bool = prev.pick::<Yes>(()).unpack().is_yes();
let confirm: bool = prev.pick::<bool>(["--confirm", "-C"]).unpack();
@@ -301,7 +301,7 @@ dispatcher!("connect", ConnectCommand => ConnectEntry);
pack!(ResultConnected = Address);
#[chain]
-fn handle_connect_entry(prev: ConnectEntry) -> NextProcess {
+fn handle_connect_entry(prev: ConnectEntry) -> Next {
let address: Address = prev.pick("--addr").unpack();
ResultConnected::new(address)
}
@@ -346,7 +346,7 @@ impl PickableEnum for Fruits {}
pack!(ResultFruit = Fruits);
#[chain]
-fn handle_eat_fruit_entry(prev: EatFruitEntry) -> NextProcess {
+fn handle_eat_fruit_entry(prev: EatFruitEntry) -> Next {
let fruit: Fruits = prev.pick("--fruit").unpack();
ResultFruit::new(fruit)
}
diff --git a/docs/pages/1-creating-your-first-program.md b/docs/pages/1-creating-your-first-program.md
index 0a6ff3c..56b7b90 100644
--- a/docs/pages/1-creating-your-first-program.md
+++ b/docs/pages/1-creating-your-first-program.md
@@ -163,7 +163,7 @@ dispatcher!("greet", GreetCommand => GreetEntry);
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args
.first()
@@ -185,15 +185,15 @@ fn render_greet_someone(prev: ResultGreetSomeone) {
This inserts a `Chain` between the original `Dispatcher` and `Renderer`: it extracts the user's input params (or falls back to "World"), then passes them to the renderer to print to the terminal.
-##### About `NextProcess` 💡
+##### About `Next` 💡
- `NextProcess` is a placeholder generated by `gen_program!()`. After `#[chain]` expands, it's replaced by a type-erased type `ChainProcess<ThisProgram>` that the dispatcher can recognize, helping reduce boilerplate code.
+ `Next` is a placeholder generated by `gen_program!()`. After `#[chain]` expands, it's replaced by a type-erased type `ChainProcess<ThisProgram>` that the dispatcher can recognize, helping reduce boilerplate code.
> [!NOTE]
>
-> `NextProcess` is a temporary solution; the next update will wait until Rust's `Impl In Type Aliases` feature is stable.
+> `Next` is a temporary solution; the next update will wait until Rust's `Impl In Type Aliases` feature is stable.
>
-> **But don't worry**: the next `NextProcess` update won't introduce **breaking changes!**
+> **But don't worry**: the next `Next` update won't introduce **breaking changes!**
##### About `pack!` 💡
@@ -227,7 +227,7 @@ dispatcher!("greet", GreetCommand => GreetEntry);
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
diff --git a/docs/pages/2-implementing-fallbacks.md b/docs/pages/2-implementing-fallbacks.md
index 685d238..3f3cb93 100644
--- a/docs/pages/2-implementing-fallbacks.md
+++ b/docs/pages/2-implementing-fallbacks.md
@@ -97,7 +97,7 @@ fn main() {
pack!(ResultGreetSomeone = String);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let args = prev.inner;
let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
diff --git a/docs/pages/3-parsing-complex-arguments.md b/docs/pages/3-parsing-complex-arguments.md
index b48b28b..141c571 100644
--- a/docs/pages/3-parsing-complex-arguments.md
+++ b/docs/pages/3-parsing-complex-arguments.md
@@ -29,7 +29,7 @@ mingling = {
```rust
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
// Prev. approach:
// let args = prev.inner;
// let name = args.first().cloned().unwrap_or_else(|| "World".to_string());
@@ -118,7 +118,7 @@ pack!(ResultGreetSomeone = String);
pack!(ErrorGreetNoNameProvided = ());
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
// Use `pick_or_route` to extract the `--name` arg
// If missing or parse fails, route to ErrorGreetNoNameProvided
let pick_result = prev
@@ -167,7 +167,7 @@ let name = match pick_result {
```rust
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let name = prev
.pick_or(["--name", "-n"], "World")
// After extracting `--name`, format it immediately
@@ -192,7 +192,7 @@ pack!(ResultGreetSomeone = String);
pack!(ErrorGreetNameTooLong = usize);
#[chain]
-fn handle_greet_entry(prev: GreetEntry) -> NextProcess {
+fn handle_greet_entry(prev: GreetEntry) -> Next {
let pick_result = prev
.pick_or(["--name", "-n"], "World")
// Unlike `after`, this borrows &String
@@ -244,7 +244,7 @@ fn render_greet_someone(prev: ResultGreetSomeone) {
```rust
#[chain]
-fn handle_some_entry(prev: SomeEntry) -> NextProcess {
+fn handle_some_entry(prev: SomeEntry) -> Next {
let confirmed: bool = prev.pick::<Yes>(()).unpack().is_yes();
let confirm: bool = prev.pick::<bool>(["--confirm", "-C"]).unpack();
@@ -301,7 +301,7 @@ dispatcher!("connect", ConnectCommand => ConnectEntry);
pack!(ResultConnected = Address);
#[chain]
-fn handle_connect_entry(prev: ConnectEntry) -> NextProcess {
+fn handle_connect_entry(prev: ConnectEntry) -> Next {
let address: Address = prev.pick("--addr").unpack();
ResultConnected::new(address)
}
@@ -346,7 +346,7 @@ impl PickableEnum for Fruits {}
pack!(ResultFruit = Fruits);
#[chain]
-fn handle_eat_fruit_entry(prev: EatFruitEntry) -> NextProcess {
+fn handle_eat_fruit_entry(prev: EatFruitEntry) -> Next {
let fruit: Fruits = prev.pick("--fruit").unpack();
ResultFruit::new(fruit)
}
diff --git a/examples/example-async/src/main.rs b/examples/example-async/src/main.rs
index 889895c..7b0be38 100644
--- a/examples/example-async/src/main.rs
+++ b/examples/example-async/src/main.rs
@@ -35,8 +35,8 @@ pack!(Hello = String);
// You can freely use async / non-async functions to declare your Chain
#[chain]
-// fn parse_name(prev: HelloEntry) -> NextProcess {
-async fn parse_name(prev: HelloEntry) -> NextProcess {
+// fn parse_name(prev: HelloEntry) -> Next {
+async fn parse_name(prev: HelloEntry) -> Next {
let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
Hello::new(name).to_render()
}
diff --git a/examples/example-basic/src/main.rs b/examples/example-basic/src/main.rs
index 660cd68..33840fc 100644
--- a/examples/example-basic/src/main.rs
+++ b/examples/example-basic/src/main.rs
@@ -26,7 +26,7 @@ pack!(Hello = String);
// Register chain to `ThisProgram`, handling logic from `HelloEntry`
#[chain]
-fn parse_name(prev: HelloEntry) -> NextProcess {
+fn parse_name(prev: HelloEntry) -> Next {
// Extract string from `HelloEntry` as argument
let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
diff --git a/examples/example-completion/src/main.rs b/examples/example-completion/src/main.rs
index 8f1714c..31528d1 100644
--- a/examples/example-completion/src/main.rs
+++ b/examples/example-completion/src/main.rs
@@ -36,9 +36,9 @@
use mingling::prelude::*;
use mingling::{
- EnumTag, Groupped, ShellContext, Suggest,
macros::{suggest, suggest_enum},
parser::{PickableEnum, Picker},
+ EnumTag, Groupped, ShellContext, Suggest,
};
// Define dispatcher `FruitCommand`, directing subcommand "fruit" to `FruitEntry`
@@ -105,7 +105,7 @@ enum FruitType {
impl PickableEnum for FruitType {}
#[chain]
-fn parse_fruit_info(prev: FruitEntry) -> NextProcess {
+fn parse_fruit_info(prev: FruitEntry) -> Next {
let picker = Picker::from(prev.inner);
let (fruit_name, fruit_type) = picker.pick("--name").pick("--type").unpack();
let info = FruitInfo {
diff --git a/examples/example-exit-code/src/main.rs b/examples/example-exit-code/src/main.rs
index def96d8..028692e 100644
--- a/examples/example-exit-code/src/main.rs
+++ b/examples/example-exit-code/src/main.rs
@@ -28,7 +28,7 @@ dispatcher!("error", ErrorCommand => ErrorEntry);
pack!(ResultError = ());
#[chain]
-fn handle_error_entry(_prev: ErrorEntry) -> NextProcess {
+fn handle_error_entry(_prev: ErrorEntry) -> Next {
update_exit_code::<ThisProgram>(1);
return ResultError::default();
}
diff --git a/examples/example-general-renderer/src/main.rs b/examples/example-general-renderer/src/main.rs
index 867c43e..64d8d00 100644
--- a/examples/example-general-renderer/src/main.rs
+++ b/examples/example-general-renderer/src/main.rs
@@ -33,7 +33,7 @@
//! ```
use mingling::prelude::*;
-use mingling::{Groupped, parser::Picker, setup::GeneralRendererSetup};
+use mingling::{parser::Picker, setup::GeneralRendererSetup, Groupped};
use serde::Serialize;
dispatcher!("render", RenderCommand => RenderCommandEntry);
@@ -56,7 +56,7 @@ struct Info {
}
#[chain]
-fn parse_render(prev: RenderCommandEntry) -> NextProcess {
+fn parse_render(prev: RenderCommandEntry) -> Next {
let (name, age) = Picker::new(prev.inner)
.pick::<String>(())
.pick::<i32>(())
diff --git a/examples/example-picker/src/main.rs b/examples/example-picker/src/main.rs
index e5bf403..651edb3 100644
--- a/examples/example-picker/src/main.rs
+++ b/examples/example-picker/src/main.rs
@@ -31,7 +31,7 @@ pack!(NoNameProvided = ());
pack!(ParsedPickInput = (i32, String));
#[chain]
-fn parse(prev: PickEntry) -> NextProcess {
+fn parse(prev: PickEntry) -> Next {
let picked = prev
// First extract the named argument
.pick_or("--age", 20)
diff --git a/examples/example-resources/src/main.rs b/examples/example-resources/src/main.rs
index 63ebfe6..9d8dde6 100644
--- a/examples/example-resources/src/main.rs
+++ b/examples/example-resources/src/main.rs
@@ -35,7 +35,7 @@ pack!(ResultCurrentDir = PathBuf);
fn setup(
_prev: SetupEntry,
resource: &mut MyResource, // Import the resource into `setup`
-) -> NextProcess {
+) -> Next {
// Set the global resource
resource.current_dir = current_dir().unwrap();
@@ -43,7 +43,7 @@ fn setup(
}
#[chain]
-fn read(_prev: StateRead, resource: &MyResource) -> NextProcess {
+fn read(_prev: StateRead, resource: &MyResource) -> Next {
// Read the global resource
let current_dir = resource.current_dir.clone();
ResultCurrentDir::new(current_dir).to_render()
diff --git a/mingling/README.md b/mingling/README.md
index c20955a..749c597 100644
--- a/mingling/README.md
+++ b/mingling/README.md
@@ -168,7 +168,7 @@ fn comp_greet_command(ctx: &ShellContext) -> Suggest {
// Define chain, parsing `GreetEntry` into `StateGreeting`
#[chain]
-fn parse_name_to_greet(prev: GreetEntry) -> NextProcess {
+fn parse_name_to_greet(prev: GreetEntry) -> Next {
let state_greeting: StateGreeting =
prev.pick_or::<String>((), "World").unpack().into();
state_greeting
diff --git a/mingling/src/example_docs.rs b/mingling/src/example_docs.rs
index d7e7029..806553f 100644
--- a/mingling/src/example_docs.rs
+++ b/mingling/src/example_docs.rs
@@ -51,8 +51,8 @@
/// // You can freely use async / non-async functions to declare your Chain
///
/// #[chain]
-/// // fn parse_name(prev: HelloEntry) -> NextProcess {
-/// async fn parse_name(prev: HelloEntry) -> NextProcess {
+/// // fn parse_name(prev: HelloEntry) -> Next {
+/// async fn parse_name(prev: HelloEntry) -> Next {
/// let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
/// Hello::new(name).to_render()
/// }
@@ -107,7 +107,7 @@ pub mod example_async {}
///
/// // Register chain to `ThisProgram`, handling logic from `HelloEntry`
/// #[chain]
-/// fn parse_name(prev: HelloEntry) -> NextProcess {
+/// fn parse_name(prev: HelloEntry) -> Next {
/// // Extract string from `HelloEntry` as argument
/// let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
///
@@ -179,9 +179,9 @@ pub mod example_basic {}
/// ```ignore
/// use mingling::prelude::*;
/// use mingling::{
-/// EnumTag, Groupped, ShellContext, Suggest,
/// macros::{suggest, suggest_enum},
/// parser::{PickableEnum, Picker},
+/// EnumTag, Groupped, ShellContext, Suggest,
/// };
///
/// // Define dispatcher `FruitCommand`, directing subcommand "fruit" to `FruitEntry`
@@ -248,7 +248,7 @@ pub mod example_basic {}
/// impl PickableEnum for FruitType {}
///
/// #[chain]
-/// fn parse_fruit_info(prev: FruitEntry) -> NextProcess {
+/// fn parse_fruit_info(prev: FruitEntry) -> Next {
/// let picker = Picker::from(prev.inner);
/// let (fruit_name, fruit_type) = picker.pick("--name").pick("--type").unpack();
/// let info = FruitInfo {
@@ -385,7 +385,7 @@ pub mod example_dispatch_tree {}
/// pack!(ResultError = ());
///
/// #[chain]
-/// fn handle_error_entry(_prev: ErrorEntry) -> NextProcess {
+/// fn handle_error_entry(_prev: ErrorEntry) -> Next {
/// update_exit_code::<ThisProgram>(1);
/// return ResultError::default();
/// }
@@ -453,7 +453,7 @@ pub mod example_exit_code {}
/// main.rs
/// ```ignore
/// use mingling::prelude::*;
-/// use mingling::{Groupped, parser::Picker, setup::GeneralRendererSetup};
+/// use mingling::{parser::Picker, setup::GeneralRendererSetup, Groupped};
/// use serde::Serialize;
///
/// dispatcher!("render", RenderCommand => RenderCommandEntry);
@@ -476,7 +476,7 @@ pub mod example_exit_code {}
/// }
///
/// #[chain]
-/// fn parse_render(prev: RenderCommandEntry) -> NextProcess {
+/// fn parse_render(prev: RenderCommandEntry) -> Next {
/// let (name, age) = Picker::new(prev.inner)
/// .pick::<String>(())
/// .pick::<i32>(())
@@ -540,7 +540,7 @@ pub mod example_general_renderer {}
/// pack!(ParsedPickInput = (i32, String));
///
/// #[chain]
-/// fn parse(prev: PickEntry) -> NextProcess {
+/// fn parse(prev: PickEntry) -> Next {
/// let picked = prev
/// // First extract the named argument
/// .pick_or("--age", 20)
@@ -619,7 +619,7 @@ pub mod example_picker {}
/// fn setup(
/// _prev: SetupEntry,
/// resource: &mut MyResource, // Import the resource into `setup`
-/// ) -> NextProcess {
+/// ) -> Next {
/// // Set the global resource
/// resource.current_dir = current_dir().unwrap();
///
@@ -627,7 +627,7 @@ pub mod example_picker {}
/// }
///
/// #[chain]
-/// fn read(_prev: StateRead, resource: &MyResource) -> NextProcess {
+/// fn read(_prev: StateRead, resource: &MyResource) -> Next {
/// // Read the global resource
/// let current_dir = resource.current_dir.clone();
/// ResultCurrentDir::new(current_dir).to_render()
diff --git a/mingling_core/src/any.rs b/mingling_core/src/any.rs
index 21611a7..b8ff7b2 100644
--- a/mingling_core/src/any.rs
+++ b/mingling_core/src/any.rs
@@ -66,12 +66,12 @@ impl<G> AnyOutput<G> {
/// Route the output to the next Chain
pub fn route_chain(self) -> ChainProcess<G> {
- ChainProcess::Ok((self, Next::Chain))
+ ChainProcess::Ok((self, NextProcess::Chain))
}
/// Route the output to the Renderer, ending execution
pub fn route_renderer(self) -> ChainProcess<G> {
- ChainProcess::Ok((self, Next::Renderer))
+ ChainProcess::Ok((self, NextProcess::Renderer))
}
#[cfg(feature = "general_renderer")]
@@ -105,11 +105,11 @@ impl<G> std::ops::DerefMut for AnyOutput<G> {
/// Chain exec result type
///
/// Stores `Ok` and `Err` types of execution results, used to notify the scheduler what to execute next
-/// - Returns `Ok((`[`AnyOutput`](./struct.AnyOutput.html)`, `[`Next::Chain`](./enum.Next.html)`))` to continue execution with this type next
-/// - Returns `Ok((`[`AnyOutput`](./struct.AnyOutput.html)`, `[`Next::Renderer`](./enum.Next.html)`))` to render this type next and output to the terminal
+/// - Returns `Ok((`[`AnyOutput`](./struct.AnyOutput.html)`, `[`NextProcess::Chain`](./enum.NextProcess.html)`))` to continue execution with this type next
+/// - Returns `Ok((`[`AnyOutput`](./struct.AnyOutput.html)`, `[`NextProcess::Renderer`](./enum.NextProcess.html)`))` to render this type next and output to the terminal
/// - Returns `Err(`[`ChainProcessError`](./error/enum.ChainProcessError.html)`]` to terminate the program directly
pub enum ChainProcess<G> {
- Ok((AnyOutput<G>, Next)),
+ Ok((AnyOutput<G>, NextProcess)),
Err(ChainProcessError),
}
@@ -118,22 +118,22 @@ pub enum ChainProcess<G> {
/// - `Chain`: Continue execution to the next chain
/// - `Renderer`: Send output to renderer and end execution
#[derive(Debug, PartialEq, Eq)]
-pub enum Next {
+pub enum NextProcess {
Chain,
Renderer,
}
-impl std::fmt::Display for Next {
+impl std::fmt::Display for NextProcess {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
- Next::Chain => write!(f, "Chain"),
- Next::Renderer => write!(f, "Renderer"),
+ NextProcess::Chain => write!(f, "Chain"),
+ NextProcess::Renderer => write!(f, "Renderer"),
}
}
}
impl<G> From<AnyOutput<G>> for ChainProcess<G> {
fn from(value: AnyOutput<G>) -> Self {
- ChainProcess::Ok((value, Next::Chain))
+ ChainProcess::Ok((value, NextProcess::Chain))
}
}
diff --git a/mingling_core/src/program/exec.rs b/mingling_core/src/program/exec.rs
index 7f7aee4..969b64e 100644
--- a/mingling_core/src/program/exec.rs
+++ b/mingling_core/src/program/exec.rs
@@ -1,7 +1,7 @@
#![allow(clippy::borrowed_box)]
use crate::{
- AnyOutput, ChainProcess, Dispatcher, Next, Program, ProgramCollect, RenderResult,
+ AnyOutput, ChainProcess, Dispatcher, NextProcess, Program, ProgramCollect, RenderResult,
error::ProgramInternalExecuteError,
};
@@ -50,7 +50,7 @@ where
program.run_hook_pre_chain(&current.member_id, current.inner.as_ref());
match C::do_chain(current).await {
- ChainProcess::Ok((any, Next::Renderer)) => {
+ ChainProcess::Ok((any, NextProcess::Renderer)) => {
let mut render_result = render::<C>(program, any);
// Run hook
@@ -58,7 +58,7 @@ where
return Ok(render_result);
}
- ChainProcess::Ok((any, Next::Chain)) => {
+ ChainProcess::Ok((any, NextProcess::Chain)) => {
// Run hook
program.run_hook_post_chain(&any);
any
@@ -142,7 +142,7 @@ where
program.run_hook_pre_chain(&current.member_id, current.inner.as_ref());
match C::do_chain(current) {
- ChainProcess::Ok((any, Next::Renderer)) => {
+ ChainProcess::Ok((any, NextProcess::Renderer)) => {
{
let mut render_result = render::<C>(program, any);
@@ -152,7 +152,7 @@ where
return Ok(render_result);
};
}
- ChainProcess::Ok((any, Next::Chain)) => {
+ ChainProcess::Ok((any, NextProcess::Chain)) => {
// Run hook
program.run_hook_post_chain(&any);
any
diff --git a/mingling_core/src/tester/chain_process_tester.rs b/mingling_core/src/tester/chain_process_tester.rs
index 8cba772..20277fb 100644
--- a/mingling_core/src/tester/chain_process_tester.rs
+++ b/mingling_core/src/tester/chain_process_tester.rs
@@ -1,6 +1,6 @@
use std::fmt::Display;
-use crate::{ChainProcess, Next, ProgramCollect};
+use crate::{ChainProcess, NextProcess, ProgramCollect};
/// Asserts that the chain process result has the expected output type and next state.
///
@@ -26,7 +26,7 @@ use crate::{ChainProcess, Next, ProgramCollect};
/// - The result is `ChainProcess::Err`, outputting the error message.
/// - When `member_id` is not `None` and does not equal the actual output's `member_id`, displaying the expected and actual values.
/// - When `next` is not `None` and does not equal the actual next state, displaying the expected and actual values.
-pub fn assert_next_eq<C>(result: &ChainProcess<C>, next: Option<Next>, member_id: Option<C>)
+pub fn assert_next_eq<C>(result: &ChainProcess<C>, next: Option<NextProcess>, member_id: Option<C>)
where
C: ProgramCollect + Display + PartialEq + 'static,
{
diff --git a/mingling_macros/src/chain.rs b/mingling_macros/src/chain.rs
index 111c584..02bbc6f 100644
--- a/mingling_macros/src/chain.rs
+++ b/mingling_macros/src/chain.rs
@@ -153,23 +153,22 @@ fn parse_chain_attr_args(attr: TokenStream) -> (proc_macro2::TokenStream, bool)
}
}
-/// Validates that the return type of the function is `NextProcess`.
+/// Validates that the return type of the function is `Next`.
fn validate_return_type_is_next_process(sig: &Signature) -> Result<(), proc_macro2::TokenStream> {
match &sig.output {
ReturnType::Type(_, ty) => match &**ty {
Type::Path(type_path) => {
let last_segment = type_path.path.segments.last().unwrap();
- if last_segment.ident != "NextProcess" {
- return Err(syn::Error::new(
- ty.span(),
- "Chain function must return `NextProcess`",
- )
- .to_compile_error());
+ if last_segment.ident != "Next" {
+ return Err(
+ syn::Error::new(ty.span(), "Chain function must return `Next`")
+ .to_compile_error(),
+ );
}
}
_ => {
return Err(
- syn::Error::new(ty.span(), "Chain function must return `NextProcess`")
+ syn::Error::new(ty.span(), "Chain function must return `Next`")
.to_compile_error(),
);
}
@@ -177,7 +176,7 @@ fn validate_return_type_is_next_process(sig: &Signature) -> Result<(), proc_macr
ReturnType::Default => {
return Err(syn::Error::new(
sig.span(),
- "Chain function must specify a return type (must be `NextProcess`)",
+ "Chain function must specify a return type (must be `Next`)",
)
.to_compile_error());
}
diff --git a/mingling_macros/src/lib.rs b/mingling_macros/src/lib.rs
index d5bdf35..85b89a3 100644
--- a/mingling_macros/src/lib.rs
+++ b/mingling_macros/src/lib.rs
@@ -362,14 +362,14 @@ pub fn r_println(input: TokenStream) -> TokenStream {
/// ```rust,ignore
/// // Default program (ThisProgram):
/// #[chain]
-/// fn my_step(prev: InputType) -> NextProcess {
+/// fn my_step(prev: InputType) -> Next {
/// // transform `prev`...
/// OutputType::new(result)
/// }
///
/// // Explicit program name:
/// #[chain(MyProgram)]
-/// fn my_step(prev: InputType) -> NextProcess {
+/// fn my_step(prev: InputType) -> Next {
/// // ...
/// }
/// ```
@@ -387,7 +387,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
///
/// ```rust,ignore
/// #[chain]
-/// fn process(prev: HelloEntry, age: &Age, name: &Name) -> NextProcess {
+/// fn process(prev: HelloEntry, age: &Age, name: &Name) -> Next {
/// // `age` and `name` are automatically injected
/// println!("Age: {}, Name: {}", age, name);
/// NextStep::default()
@@ -410,7 +410,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
///
/// ```rust,ignore
/// #[chain]
-/// fn process(prev: HelloEntry, count: &mut InvocationCount, name: &Name) -> NextProcess {
+/// fn process(prev: HelloEntry, count: &mut InvocationCount, name: &Name) -> Next {
/// count.0 += 1;
/// println!("Invocation #{} for {}", count.0, name);
/// NextStep::default()
@@ -448,7 +448,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
/// pack!(MyOutput = String);
///
/// #[chain]
-/// fn greet(prev: HelloEntry) -> NextProcess {
+/// fn greet(prev: HelloEntry) -> Next {
/// let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
/// MyOutput::new(name)
/// }
@@ -466,7 +466,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
/// pack!(DisplayCount = ());
///
/// #[chain]
-/// fn greet(prev: HelloEntry, user_name: &UserName, count: &mut u64) -> NextProcess {
+/// fn greet(prev: HelloEntry, user_name: &UserName, count: &mut u64) -> Next {
/// r_println!("User: {:?}", user_name);
/// *count += 1;
/// Greeting::new(format!("Hello, {}!", user_name.0))
@@ -481,7 +481,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
/// pack!(MyOutput = String);
///
/// #[chain]
-/// async fn greet(prev: HelloEntry) -> NextProcess {
+/// async fn greet(prev: HelloEntry) -> Next {
/// let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
/// some_async_fn(&name).await;
/// MyOutput::new(name)
@@ -496,7 +496,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
/// pack!(MyOutput = String);
///
/// #[chain]
-/// async fn greet(prev: HelloEntry, prefix: &Prefix) -> NextProcess {
+/// async fn greet(prev: HelloEntry, prefix: &Prefix) -> Next {
/// let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
/// some_async_fn(&name).await;
/// MyOutput::new(format!("{}{}", prefix.0, name))
@@ -507,7 +507,7 @@ pub fn r_println(input: TokenStream) -> TokenStream {
///
/// - The function must have at least **one** parameter (the previous type in the chain).
/// - The first parameter must be taken **by move**.
-/// - The function must return `NextProcess` (the type alias generated by `gen_program!`, which equals `ChainProcess<ProgramName>`).
+/// - The function must return `Next` (the type alias generated by `gen_program!`, which equals `ChainProcess<ProgramName>`).
/// - With the `async` feature, async functions are supported; without it, async functions are rejected.
#[proc_macro_attribute]
pub fn chain(attr: TokenStream, item: TokenStream) -> TokenStream {
@@ -948,7 +948,7 @@ pub fn derive_groupped_serialize(input: TokenStream) -> TokenStream {
/// # What it generates
///
/// The macro expands to:
-/// 1. **`pub type NextProcess = ChainProcess<ProgramName>`** — A convenience type alias
+/// 1. **`pub type Next = ChainProcess<ProgramName>`** — A convenience type alias
/// for use in chain function return types.
/// 2. **`program_comp_gen!(...)`** (with `comp` feature) — Generates completion infrastructure.
/// 3. **`program_fallback_gen!(...)`** — Generates `RendererNotFound` and `DispatcherNotFound` types.
@@ -966,7 +966,7 @@ pub fn derive_groupped_serialize(input: TokenStream) -> TokenStream {
/// dispatcher!("hello", HelloCommand => HelloEntry);
///
/// #[chain]
-/// fn process(prev: HelloEntry) -> NextProcess {
+/// fn process(prev: HelloEntry) -> Next {
/// // ...
/// }
///
@@ -993,8 +993,8 @@ pub fn gen_program(input: TokenStream) -> TokenStream {
TokenStream::from(quote! {
// Shit, this feature is unstable
// TODO :: This logic will be implemented when Rust's Impl In Type Alias feature becomes stable
- // pub type NextProcess = impl Into<::mingling::ChainProcess<#name>>;
- pub type NextProcess = ::mingling::ChainProcess<#name>;
+ // pub type Next = impl Into<::mingling::ChainProcess<#name>>;
+ pub type Next = ::mingling::ChainProcess<#name>;
#comp_gen
::mingling::macros::program_fallback_gen!(#name);
@@ -1022,7 +1022,7 @@ pub fn program_comp_gen(input: TokenStream) -> TokenStream {
#[cfg(feature = "async")]
let fn_exec_comp = quote! {
#[::mingling::macros::chain(#name)]
- pub async fn __exec_completion(prev: CompletionContext) -> NextProcess {
+ pub async fn __exec_completion(prev: CompletionContext) -> Next {
let read_ctx = ::mingling::ShellContext::try_from(prev.inner);
match read_ctx {
Ok(ctx) => {
@@ -1037,7 +1037,7 @@ pub fn program_comp_gen(input: TokenStream) -> TokenStream {
#[cfg(not(feature = "async"))]
let fn_exec_comp = quote! {
#[::mingling::macros::chain(#name)]
- pub fn __exec_completion(prev: CompletionContext) -> NextProcess {
+ pub fn __exec_completion(prev: CompletionContext) -> Next {
let read_ctx = ::mingling::ShellContext::try_from(prev.inner);
match read_ctx {
Ok(ctx) => {
diff --git a/mling/src/cli/install.rs b/mling/src/cli/install.rs
index 59d1d97..dd6dec4 100644
--- a/mling/src/cli/install.rs
+++ b/mling/src/cli/install.rs
@@ -22,7 +22,7 @@ pub(crate) fn comp_install(ctx: &ShellContext) -> Suggest {
}
#[chain]
-pub(crate) fn handle_install_entry(prev: InstallEntry) -> NextProcess {
+pub(crate) fn handle_install_entry(prev: InstallEntry) -> Next {
let is_clean_before_build = Picker::new(prev.inner)
.pick::<bool>(["--clean", "-c"])
.unpack();
diff --git a/mling/src/cli/list.rs b/mling/src/cli/list.rs
index 49712b8..3ae9ef6 100644
--- a/mling/src/cli/list.rs
+++ b/mling/src/cli/list.rs
@@ -32,7 +32,7 @@ pub(crate) enum StateListInstalledOptions {
pack!(MutexErrorListInstalled = ());
#[chain]
-pub(crate) fn handle_list_installed_entry(prev: ListInstalledEntry) -> NextProcess {
+pub(crate) fn handle_list_installed_entry(prev: ListInstalledEntry) -> Next {
let picker = Picker::new(prev.inner);
let r = picker
.pick::<bool>("--trusted")
@@ -64,7 +64,7 @@ pub(crate) struct ResultInstalledNamespaces {
}
#[chain]
-pub(crate) fn handle_state_list_installed_option(prev: StateListInstalledOptions) -> NextProcess {
+pub(crate) fn handle_state_list_installed_option(prev: StateListInstalledOptions) -> Next {
ResultInstalledNamespaces {
trusted: list_namespaces(true, false, false),
untrusted: list_namespaces(false, true, false),
diff --git a/mling/src/cli/namespace_mgr.rs b/mling/src/cli/namespace_mgr.rs
index 0f5a115..0f11332 100644
--- a/mling/src/cli/namespace_mgr.rs
+++ b/mling/src/cli/namespace_mgr.rs
@@ -79,7 +79,7 @@ pub(crate) fn comp_remove_namespace(ctx: &ShellContext) -> Suggest {
}
#[chain]
-pub(crate) fn handle_set_trust(p: SetTrustNamespaceEntry) -> NextProcess {
+pub(crate) fn handle_set_trust(p: SetTrustNamespaceEntry) -> Next {
let (trusted, namespace) = route!(
Picker::new(p.inner)
.pick::<Yes>(["-t", "--trusted"])
@@ -91,7 +91,7 @@ pub(crate) fn handle_set_trust(p: SetTrustNamespaceEntry) -> NextProcess {
}
#[chain]
-pub(crate) fn handle_trust(p: TrustNamespaceEntry) -> NextProcess {
+pub(crate) fn handle_trust(p: TrustNamespaceEntry) -> Next {
SetTrustNamespaceEntry::new({
let mut args = p.inner.clone();
args.extend(vec!["-t".to_string(), "yes".to_string()]);
@@ -100,7 +100,7 @@ pub(crate) fn handle_trust(p: TrustNamespaceEntry) -> NextProcess {
}
#[chain]
-pub(crate) fn handle_untrust(p: UntrustNamespaceEntry) -> NextProcess {
+pub(crate) fn handle_untrust(p: UntrustNamespaceEntry) -> Next {
SetTrustNamespaceEntry::new({
let mut args = p.inner.clone();
args.extend(vec!["-t".to_string(), "no".to_string()]);
@@ -109,7 +109,7 @@ pub(crate) fn handle_untrust(p: UntrustNamespaceEntry) -> NextProcess {
}
#[chain]
-pub(crate) fn handle_remove_namespace(p: RemoveNamespaceEntry) -> NextProcess {
+pub(crate) fn handle_remove_namespace(p: RemoveNamespaceEntry) -> Next {
let namespace = route!(
Picker::new(p.inner)
.pick_or_route((), ErrorNamespaceNotProvided::default().to_render())
diff --git a/mling/src/cli/read.rs b/mling/src/cli/read.rs
index e9cd6bb..6352c94 100644
--- a/mling/src/cli/read.rs
+++ b/mling/src/cli/read.rs
@@ -22,7 +22,7 @@ pub(crate) struct ResultBinaries {
}
#[chain]
-pub(crate) fn handle_target_dir_entry(_prev: ReadTargetDirEntry) -> NextProcess {
+pub(crate) fn handle_target_dir_entry(_prev: ReadTargetDirEntry) -> Next {
match solve_current_dir() {
Ok(solved) => {
let dir = solved.target_dir;
@@ -33,7 +33,7 @@ pub(crate) fn handle_target_dir_entry(_prev: ReadTargetDirEntry) -> NextProcess
}
#[chain]
-pub(crate) fn handle_workspace_root_entry(_prev: ReadWorkspaceRootEntry) -> NextProcess {
+pub(crate) fn handle_workspace_root_entry(_prev: ReadWorkspaceRootEntry) -> Next {
match solve_current_dir() {
Ok(solved) => {
let dir = solved.workspace_root;
@@ -44,7 +44,7 @@ pub(crate) fn handle_workspace_root_entry(_prev: ReadWorkspaceRootEntry) -> Next
}
#[chain]
-pub(crate) fn handle_binaries_entry(_prev: ReadBinariesEntry) -> NextProcess {
+pub(crate) fn handle_binaries_entry(_prev: ReadBinariesEntry) -> Next {
match solve_current_dir() {
Ok(solved) => {
let binaries = solved.binaries;