From 0a2ef958c0dca21d19e4ffc38ba5a7c4078e182a Mon Sep 17 00:00:00 2001 From: Weicao-CatilGrass <1992414357@qq.com> Date: Sat, 23 May 2026 23:41:04 +0800 Subject: Rework examples and add entry macro for testing --- examples/example-exitcode/src/main.rs | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 examples/example-exitcode/src/main.rs (limited to 'examples/example-exitcode/src') 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!(); -- cgit