From 56c24db7bcd92e2eb9a779bd141fcc73a7c433c0 Mon Sep 17 00:00:00 2001 From: Weicao-CatilGrass <1992414357@qq.com> Date: Tue, 14 Apr 2026 02:59:38 +0800 Subject: Add `strip_all_flags` method and `operate_args` method --- mingling/src/parser/args.rs | 13 +++++++++++++ mingling/src/parser/picker.rs | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/mingling/src/parser/args.rs b/mingling/src/parser/args.rs index 2a07e97..9c08d43 100644 --- a/mingling/src/parser/args.rs +++ b/mingling/src/parser/args.rs @@ -154,4 +154,17 @@ impl Argument { let new = Vec::new(); replace(&mut self.vec, new) } + + /// Removes all arguments that start with a dash ('-') + /// + /// This method filters out all command-line style flags from the arguments, + /// returning a new `Argument` instance containing only non-flag arguments. + pub fn strip_all_flags(mut self) -> Self { + self.vec = self + .vec + .into_iter() + .filter(|f| !f.starts_with('-')) + .collect(); + self + } } diff --git a/mingling/src/parser/picker.rs b/mingling/src/parser/picker.rs index 9258002..d69e27a 100644 --- a/mingling/src/parser/picker.rs +++ b/mingling/src/parser/picker.rs @@ -108,6 +108,16 @@ impl Picker { None => None, } } + + /// Applies an operation to the parsed arguments and returns the modified `Picker`. + /// + /// Takes a closure that receives the current `Argument` and returns a new `Argument`. + /// The returned `Argument` replaces the original arguments in the builder. + /// This method can be used to modify or transform the parsed arguments before extracting values. + pub fn operate_args Argument>(mut self, operation: F) -> Self { + self.args = operation(self.args); + self + } } impl, G> From for Picker { @@ -189,6 +199,16 @@ macro_rules! define_pick_structs { self.$final_val = edit(self.$final_val); self } + + /// Applies an operation to the parsed arguments and returns the modified `Picker`. + /// + /// Takes a closure that receives the current `Argument` and returns a new `Argument`. + /// The returned `Argument` replaces the original arguments in the builder. + /// This method can be used to modify or transform the parsed arguments before extracting values. + pub fn operate_args Argument>(mut self, operation: F) -> Self { + self.args = operation(self.args); + self + } } }; } -- cgit From 33469c75614c444f512fd51dbc78a31a9a4bec82 Mon Sep 17 00:00:00 2001 From: Weicao-CatilGrass <1992414357@qq.com> Date: Tue, 14 Apr 2026 03:03:21 +0800 Subject: Rename add_dispatcher module to dispatcher_mgr and add remove command --- mingling_cli/Cargo.lock | 10 ++++++++ mingling_cli/Cargo.toml | 5 +++- mingling_cli/build.rs | 3 +++ mingling_cli/src/add_dispatcher.rs | 38 ------------------------------ mingling_cli/src/dispatcher_mgr.rs | 47 ++++++++++++++++++++++++++++++++++++++ mingling_cli/src/main.rs | 14 ++++++------ 6 files changed, 71 insertions(+), 46 deletions(-) create mode 100644 mingling_cli/build.rs delete mode 100644 mingling_cli/src/add_dispatcher.rs create mode 100644 mingling_cli/src/dispatcher_mgr.rs diff --git a/mingling_cli/Cargo.lock b/mingling_cli/Cargo.lock index 737f437..16f7016 100644 --- a/mingling_cli/Cargo.lock +++ b/mingling_cli/Cargo.lock @@ -36,6 +36,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5454cda0d57db59778608d7a47bff5b16c6705598265869fb052b657f66cf05e" +[[package]] +name = "just_template" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3edb658c34b10b69c4b3b58f7ba989cd09c82c0621dee1eef51843c2327225" +dependencies = [ + "just_fmt", +] + [[package]] name = "libc" version = "0.2.184" @@ -74,6 +83,7 @@ name = "mingling_core" version = "0.1.4" dependencies = [ "just_fmt", + "just_template", "once_cell", "thiserror", "tokio", diff --git a/mingling_cli/Cargo.toml b/mingling_cli/Cargo.toml index 7929eb7..23a9bd7 100644 --- a/mingling_cli/Cargo.toml +++ b/mingling_cli/Cargo.toml @@ -8,6 +8,9 @@ name = "mling" path = "src/main.rs" [dependencies] -mingling = { path = "../mingling", features = ["parser"] } +mingling = { path = "../mingling", features = ["parser", "comp"] } serde = { version = "1", features = ["derive"] } tokio = { version = "1", features = ["full"] } + +[build-dependencies] +mingling = { path = "../mingling", features = ["comp"] } diff --git a/mingling_cli/build.rs b/mingling_cli/build.rs new file mode 100644 index 0000000..89e9aae --- /dev/null +++ b/mingling_cli/build.rs @@ -0,0 +1,3 @@ +fn main() { + mingling::build::build_comp_scripts("mling").unwrap(); +} diff --git a/mingling_cli/src/add_dispatcher.rs b/mingling_cli/src/add_dispatcher.rs deleted file mode 100644 index c5eaec4..0000000 --- a/mingling_cli/src/add_dispatcher.rs +++ /dev/null @@ -1,38 +0,0 @@ -use mingling::{ - AnyOutput, - macros::{chain, dispatcher, pack, r_println, renderer}, - marker::NextProcess, - parser::Picker, -}; - -use crate::MinglingCLI; - -dispatcher!(MinglingCLI, "add.dispatcher", AddDispatcherCommand => AddDispatcherEntry); - -#[chain(MinglingCLI)] -pub async fn parse_add_dispatcher(args: AddDispatcherEntry) -> NextProcess { - let picker: Picker = Picker::new(args.inner); - let dispatcher_name = picker.pick::(()).unpack_directly().0; - let input = AddDispatcherInput::new(dispatcher_name); - input.into() -} - -pack!(MinglingCLI, AddDispatcherInput = String); - -#[chain(MinglingCLI)] -pub async fn exec_add_dispatcher(_input: AddDispatcherInput) -> NextProcess { - AnyOutput::new(AddDispatcherSuccess::new(())).route_chain() -} - -pack!(MinglingCLI, AddDispatcherSuccess = ()); -pack!(MinglingCLI, AddDispatcherFailed = String); - -#[renderer(MinglingCLI)] -pub fn render_add_dispatcher_success(_prev: AddDispatcherSuccess) { - r_println!("Dispatcher added successfully"); -} - -#[renderer(MinglingCLI)] -pub fn render_add_dispatcher_failed(prev: AddDispatcherFailed) { - r_println!("Error: {}", prev.inner); -} diff --git a/mingling_cli/src/dispatcher_mgr.rs b/mingling_cli/src/dispatcher_mgr.rs new file mode 100644 index 0000000..483a48c --- /dev/null +++ b/mingling_cli/src/dispatcher_mgr.rs @@ -0,0 +1,47 @@ +use mingling::{ + AnyOutput, + macros::{chain, dispatcher, pack, r_println, renderer}, + marker::NextProcess, + parser::Picker, +}; + +use crate::ThisProgram; + +dispatcher!("add.dispatcher", AddDispatcherCommand => AddDispatcherEntry); +dispatcher!("remove.dispatcher", RemoveDispatcherCommand => RemoveDispatcherEntry); + +#[chain] +pub async fn parse_add_dispatcher(args: AddDispatcherEntry) -> NextProcess { + let picker: Picker = Picker::new(args.inner); + let dispatcher_name = picker.pick::(()).unpack_directly().0; + let input = AddDispatcherInput::new(dispatcher_name); + input.into() +} + +#[chain] +pub async fn parse_remove_dispatcher(args: RemoveDispatcherEntry) -> NextProcess { + let picker: Picker = Picker::new(args.inner); + let dispatcher_name = picker.pick::(()).unpack_directly().0; + let input = AddDispatcherInput::new(dispatcher_name); + input.into() +} + +pack!(AddDispatcherInput = String); + +#[chain] +pub async fn exec_add_dispatcher(_input: AddDispatcherInput) -> NextProcess { + AnyOutput::new(AddDispatcherSuccess::new(())).route_chain() +} + +pack!(AddDispatcherSuccess = ()); +pack!(AddDispatcherFailed = String); + +#[renderer] +pub fn render_add_dispatcher_success(_prev: AddDispatcherSuccess) { + r_println!("Dispatcher added successfully"); +} + +#[renderer] +pub fn render_add_dispatcher_failed(prev: AddDispatcherFailed) { + r_println!("Error: {}", prev.inner); +} diff --git a/mingling_cli/src/main.rs b/mingling_cli/src/main.rs index c4dfe21..a0066f4 100644 --- a/mingling_cli/src/main.rs +++ b/mingling_cli/src/main.rs @@ -1,16 +1,16 @@ use mingling::{macros::gen_program, setup::BasicProgramSetup}; -mod add_dispatcher; -pub use crate::add_dispatcher::*; +mod dispatcher_mgr; +pub use crate::dispatcher_mgr::*; #[tokio::main] async fn main() { - let mut program = MinglingCLI::new(); + let mut program = ThisProgram::new(); program.with_setup(BasicProgramSetup); - program.with_dispatcher(AddDispatcherCommand); + program.with_dispatcher(CompletionDispatcher); + program.with_dispatchers((AddDispatcherCommand, RemoveDispatcherCommand)); - let render_result = program.exec_without_render().await.unwrap(); - println!("{}", render_result); + program.exec().await; } -gen_program!(MinglingCLI); +gen_program!(); -- cgit