summaryrefslogtreecommitdiff
path: root/examples/example-picker
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example-picker')
-rw-r--r--examples/example-picker/Cargo.toml9
-rw-r--r--examples/example-picker/src/main.rs68
2 files changed, 77 insertions, 0 deletions
diff --git a/examples/example-picker/Cargo.toml b/examples/example-picker/Cargo.toml
new file mode 100644
index 0000000..2e514f7
--- /dev/null
+++ b/examples/example-picker/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "example-picker"
+version.workspace = true
+edition = "2024"
+
+[dependencies]
+mingling.workspace = true
+tokio.workspace = true
+serde.workspace = true
diff --git a/examples/example-picker/src/main.rs b/examples/example-picker/src/main.rs
new file mode 100644
index 0000000..24357a8
--- /dev/null
+++ b/examples/example-picker/src/main.rs
@@ -0,0 +1,68 @@
+//! `Mingling` Example - Picker
+//!
+//! ## Step1 - Enable Feature
+//! Enable the `parser` feature for mingling in `Cargo.toml`
+//! ```toml
+//! [dependencies]
+//! mingling = { version = "...", features = ["parser"] }
+//! ```
+//!
+//! ## Step2 - Write Code
+//! Write the following content into `main.rs`
+//!
+//! ## Step3 - Build and Run
+//! ```bash
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick Bob
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick Bob --age -15
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick --age 99
+//! ```
+
+use mingling::{
+ AnyOutput,
+ macros::{chain, dispatcher, gen_program, pack, r_println, renderer},
+ marker::NextProcess,
+ parser::Picker,
+};
+
+dispatcher!("pick", PickCommand => PickEntry);
+
+#[tokio::main]
+async fn main() {
+ let mut program = DefaultProgram::new();
+ program.with_dispatcher(PickCommand);
+ program.exec().await;
+}
+
+pack!(NoNameProvided = ());
+pack!(ParsedPickInput = (i32, String));
+
+#[chain]
+async fn parse(prev: PickEntry) -> NextProcess {
+ // Extract arguments from `PickEntry`'s inner and create a `Picker`
+ let picker = Picker::new(prev.inner);
+ let picked = picker
+ // First extract the named argument
+ .pick_or("--age", 20)
+ .after(|n: i32| n.clamp(0, 100))
+ // Then sequentially extract the remaining arguments
+ .pick_or_route((), AnyOutput::new(NoNameProvided::default()))
+ .unpack();
+
+ match picked {
+ Ok(value) => ParsedPickInput::new(value).to_render(),
+ Err(e) => e.route_renderer(),
+ }
+}
+
+#[renderer]
+fn render_parsed_pick_input(prev: ParsedPickInput) {
+ let (age, name) = prev.inner;
+ r_println!("Picked: name = {}, age = {}", name, age);
+}
+
+#[renderer]
+fn render_no_name_input(_prev: NoNameProvided) {
+ r_println!("No name provided.");
+}
+
+gen_program!();