From bcbf0506ff255129d5a66d709bdb6aafbfbe2331 Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sat, 25 Apr 2026 19:12:00 +0800 Subject: Add async example demonstrating tokio integration --- examples/example-async/src/main.rs | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 examples/example-async/src/main.rs (limited to 'examples/example-async/src') diff --git a/examples/example-async/src/main.rs b/examples/example-async/src/main.rs new file mode 100644 index 0000000..29aee7e --- /dev/null +++ b/examples/example-async/src/main.rs @@ -0,0 +1,53 @@ +//! `Mingling` Example - Async +//! +//! After enabling the `async` feature: +//! 1. The `chain!` macro will support using **async** functions, +//! 2. The `exec` function of `Program` will return a `Future` for you to use with an async runtime +//! +//! ## Enable Feature +//! Enable the `async` feature for mingling in `Cargo.toml` +//! ```toml +//! [dependencies] +//! mingling = { version = "...", features = ["async"] } +//! ``` +//! +//! # How to Run +//! ```bash +//! cargo run --manifest-path ./examples/example-async/Cargo.toml -- hello World +//! ``` + +use mingling::{ + macros::{chain, dispatcher, gen_program, pack, r_println, renderer}, + marker::NextProcess, +}; + +dispatcher!("hello", HelloCommand => HelloEntry); + +// Use Tokio async runtime +#[tokio::main] +async fn main() { + let mut program = ThisProgram::new(); + program.with_dispatcher(HelloCommand); + + // Run program + program.exec().await; +} + +pack!(Hello = String); + +// You can freely use async / non-async functions to declare your Chain + +#[chain] +// fn parse_name(prev: HelloEntry) -> NextProcess { +async fn parse_name(prev: HelloEntry) -> NextProcess { + let name = prev.first().cloned().unwrap_or_else(|| "World".to_string()); + Hello::new(name).to_render() +} + +// For renderers, you can still only use synchronous functions +#[renderer] +fn render_hello_who(prev: Hello) { + r_println!("Hello, {}!", *prev); +} + +gen_program!(); -- cgit