aboutsummaryrefslogtreecommitdiff
path: root/examples/example-exitcode/src/main.rs
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2026-05-23 23:41:04 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2026-05-23 23:49:34 +0800
commit0a2ef958c0dca21d19e4ffc38ba5a7c4078e182a (patch)
treec82fc4242ed393b132ba514eb434d722e7d9c387 /examples/example-exitcode/src/main.rs
parentccab1940c019dfbfb7dfcbbe4cb927258933755f (diff)
Rework examples and add entry macro for testing
Diffstat (limited to 'examples/example-exitcode/src/main.rs')
-rw-r--r--examples/example-exitcode/src/main.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/examples/example-exitcode/src/main.rs b/examples/example-exitcode/src/main.rs
new file mode 100644
index 0000000..178fa78
--- /dev/null
+++ b/examples/example-exitcode/src/main.rs
@@ -0,0 +1,62 @@
+//! Example Error Handling
+//!
+//! > This example demonstrates how to handle errors in Mingling, including custom error types and error rendering.
+//!
+//! Run:
+//! ```bash
+//! cargo run --manifest-path examples/example-exitcode/Cargo.toml --quiet -- hello Alice
+//! cargo run --manifest-path examples/example-exitcode/Cargo.toml --quiet -- hello
+//! ```
+//!
+//! Output:
+//! ```plaintext
+//! Hello, Alice
+//! No name provided (with exit code 1)
+//! ```
+
+use mingling::{prelude::*, res::ExitCode, setup::ExitCodeSetup};
+
+fn main() {
+ let mut program = ThisProgram::new();
+
+ // --------- IMPORTANT ---------
+ // Register `ExitCodeSetup` for the program to enable exit codes
+ program.with_setup(ExitCodeSetup::default());
+ // --------- IMPORTANT ---------
+
+ program.with_dispatcher(CMDHello);
+ program.exec_and_exit();
+}
+
+dispatcher!("hello", CMDHello => EntryHello);
+
+pack!(ErrorNoNameProvided = ());
+pack!(ResultName = String);
+
+#[chain]
+fn handle_hello(args: EntryHello) -> Next {
+ let Some(name) = args.inner.first().cloned() else {
+ // If no name is provided, pass ErrorNoNameProvided
+ return ErrorNoNameProvided::default().to_render();
+ };
+
+ // If the name is valid, pass ResultName
+ ResultName::new(name).to_render()
+}
+
+#[renderer]
+fn render_result_name(name: ResultName) {
+ r_println!("Hello, {}", *name);
+}
+
+// Define renderer, render error message _____________ Inject exit code resource
+// /
+#[renderer] // vvvvvvvvvvvvv
+fn render_error_no_name_provided(_: ErrorNoNameProvided, ec: &mut ExitCode) {
+ ec.exit_code = 1;
+
+ // Prompt when no name is provided
+ r_println!("No name provided (with exit code 1)");
+}
+
+gen_program!();