aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mingling/src/parser/args.rs13
-rw-r--r--mingling/src/parser/picker.rs20
-rw-r--r--mingling_cli/Cargo.lock10
-rw-r--r--mingling_cli/Cargo.toml5
-rw-r--r--mingling_cli/build.rs3
-rw-r--r--mingling_cli/src/dispatcher_mgr.rs (renamed from mingling_cli/src/add_dispatcher.rs)29
-rw-r--r--mingling_cli/src/main.rs14
7 files changed, 76 insertions, 18 deletions
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<R> Picker<R> {
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<F: FnOnce(Argument) -> Argument>(mut self, operation: F) -> Self {
+ self.args = operation(self.args);
+ self
+ }
}
impl<T: Into<Argument>, G> From<T> for Picker<G> {
@@ -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<F: FnOnce(Argument) -> Argument>(mut self, operation: F) -> Self {
+ self.args = operation(self.args);
+ self
+ }
}
};
}
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
@@ -37,6 +37,15 @@ 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"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -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/dispatcher_mgr.rs
index c5eaec4..483a48c 100644
--- a/mingling_cli/src/add_dispatcher.rs
+++ b/mingling_cli/src/dispatcher_mgr.rs
@@ -5,34 +5,43 @@ use mingling::{
parser::Picker,
};
-use crate::MinglingCLI;
+use crate::ThisProgram;
-dispatcher!(MinglingCLI, "add.dispatcher", AddDispatcherCommand => AddDispatcherEntry);
+dispatcher!("add.dispatcher", AddDispatcherCommand => AddDispatcherEntry);
+dispatcher!("remove.dispatcher", RemoveDispatcherCommand => RemoveDispatcherEntry);
-#[chain(MinglingCLI)]
+#[chain]
pub async fn parse_add_dispatcher(args: AddDispatcherEntry) -> NextProcess {
- let picker: Picker<MinglingCLI> = Picker::new(args.inner);
+ let picker: Picker<ThisProgram> = Picker::new(args.inner);
let dispatcher_name = picker.pick::<String>(()).unpack_directly().0;
let input = AddDispatcherInput::new(dispatcher_name);
input.into()
}
-pack!(MinglingCLI, AddDispatcherInput = String);
+#[chain]
+pub async fn parse_remove_dispatcher(args: RemoveDispatcherEntry) -> NextProcess {
+ let picker: Picker<ThisProgram> = Picker::new(args.inner);
+ let dispatcher_name = picker.pick::<String>(()).unpack_directly().0;
+ let input = AddDispatcherInput::new(dispatcher_name);
+ input.into()
+}
+
+pack!(AddDispatcherInput = String);
-#[chain(MinglingCLI)]
+#[chain]
pub async fn exec_add_dispatcher(_input: AddDispatcherInput) -> NextProcess {
AnyOutput::new(AddDispatcherSuccess::new(())).route_chain()
}
-pack!(MinglingCLI, AddDispatcherSuccess = ());
-pack!(MinglingCLI, AddDispatcherFailed = String);
+pack!(AddDispatcherSuccess = ());
+pack!(AddDispatcherFailed = String);
-#[renderer(MinglingCLI)]
+#[renderer]
pub fn render_add_dispatcher_success(_prev: AddDispatcherSuccess) {
r_println!("Dispatcher added successfully");
}
-#[renderer(MinglingCLI)]
+#[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!();