//! `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::>::new(prev.inner) .pick::(()) .pick::(()) .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!();