diff options
| author | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-17 22:30:50 +0800 |
|---|---|---|
| committer | Weicao-CatilGrass <1992414357@qq.com> | 2026-05-17 22:38:39 +0800 |
| commit | f27f5aeb09616b932ab48f0905994879dd8bafe5 (patch) | |
| tree | 2deea67f7ed910ad824fbcce2330ab5c475e51a0 | |
| parent | bdd736ad9899aed74aaa2760c6e068dcae0e6925 (diff) | |
Rename `NextProcess` to `Next` across the codebase
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) @@ -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(¤t.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(¤t.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; |
