diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-04-06 20:19:43 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-04-06 20:19:43 +0800 |
| commit | 721b6f9f608977b938dbc9b847c9221370b5ee15 (patch) | |
| tree | 95483051d50d183357a097c41a678bad14c657c0 /examples/example-general-renderer/src/main.rs | |
| parent | e68e1230d4157c32592900372699411c7151b4e5 (diff) | |
Add workspace configuration and examples
Diffstat (limited to 'examples/example-general-renderer/src/main.rs')
| -rw-r--r-- | examples/example-general-renderer/src/main.rs | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/examples/example-general-renderer/src/main.rs b/examples/example-general-renderer/src/main.rs new file mode 100644 index 0000000..09fb09a --- /dev/null +++ b/examples/example-general-renderer/src/main.rs @@ -0,0 +1,71 @@ +//! `Mingling` Example - General Renderer +//! +//! ## Step1 - Enable Feature +//! Enable the `general_renderer` feature for mingling in `Cargo.toml` +//! ```toml +//! [dependencies] +//! mingling = { version = "...", features = ["general_renderer", "parser"] } +//! ``` +//! +//! ## Step2 - Add Dependencies +//! Add `serde` dependency to `Cargo.toml` for serialization support +//! ```toml +//! [dependencies] +//! serde = { version = "1", features = ["derive"] } +//! ``` +//! +//! ## Step3 - Write Code +//! Write the following content into `main.rs` +//! +//! ## Step3 - Build and Run +//! ```bash +//! cargo run --manifest-path ./examples/example-general-renderer/Cargo.toml -- render Bob 22 +//! cargo run --manifest-path ./examples/example-general-renderer/Cargo.toml -- render Bob 22 --json +//! cargo run --manifest-path ./examples/example-general-renderer/Cargo.toml -- render Bob 22 --yaml +//! ``` + +use mingling::{ + AnyOutput, Groupped, + macros::{chain, dispatcher, gen_program, r_println, renderer}, + marker::NextProcess, + parser::Picker, + setup::GeneralRendererSetup, +}; +use serde::Serialize; + +dispatcher!("render", RenderCommand => RenderCommandEntry); + +#[tokio::main] +async fn main() { + let mut program = DefaultProgram::new(); + // Add `GeneralRendererSetup` to receive user input `--json` `--yaml` parameters + program.with_setup(GeneralRendererSetup); + program.with_dispatcher(RenderCommand); + program.exec().await; +} + +// Manually implement Info struct +#[derive(Serialize, Groupped)] +struct Info { + #[serde(rename = "member_name")] + name: String, + #[serde(rename = "member_age")] + age: i32, +} + +#[chain] +async fn parse_render(prev: RenderCommandEntry) -> NextProcess { + let (name, age) = Picker::<AnyOutput<DefaultProgram>>::new(prev.inner) + .pick::<String>(()) + .pick::<i32>(()) + .unpack_directly(); + AnyOutput::new(Info { name, age }).route_renderer() +} + +// Implement default renderer for when general_renderer is not specified +#[renderer] +fn render_info(prev: Info) { + r_println!("{} is {} years old", prev.name, prev.age); +} + +gen_program!(); |
