From d1a74ce57e5be72436376a829e9c7e1e7c1c561b Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Fri, 26 Jun 2026 06:27:16 +0800 Subject: refactor(general_renderer): rename to structural_renderer --- examples/example-structural-renderer/src/main.rs | 71 ++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 examples/example-structural-renderer/src/main.rs (limited to 'examples/example-structural-renderer/src') diff --git a/examples/example-structural-renderer/src/main.rs b/examples/example-structural-renderer/src/main.rs new file mode 100644 index 0000000..21077e7 --- /dev/null +++ b/examples/example-structural-renderer/src/main.rs @@ -0,0 +1,71 @@ +//! Example structural renderer +//! +//! > This example demonstrates how to use the `structural_renderer` feature to render data into structures such as json / yaml +//! +//! Run +//! ```bash +//! cargo run --manifest-path examples/example-structural-renderer/Cargo.toml --quiet -- render Bob 22 +//! cargo run --manifest-path examples/example-structural-renderer/Cargo.toml --quiet -- render Bob 22 --json +//! cargo run --manifest-path examples/example-structural-renderer/Cargo.toml --quiet -- render Bob 22 --yaml +//! ``` +//! +//! Output: +//! ```plain +//! Bob is 22 years old +//! {"member_name":"Bob","member_age":22} +//! member_name: Bob +//! member_age: 22 +//! ``` + +use mingling::prelude::*; +use mingling::{parser::Picker, setup::StructuralRendererSetup, StructuralData, Groupped}; +use serde::Serialize; + +dispatcher!("render", CMDRender => EntryRender); + +fn main() { + let mut program = ThisProgram::new(); + // Add `StructuralRendererSetup` to receive user input `--json` `--yaml` parameters + program.with_setup(StructuralRendererSetup); + program.with_dispatcher(CMDRender); + let _ = program.exec(); +} + +// --------- IMPORTANT --------- +// For beautiful output structure, do not use `pack!` to wrap the types that need to be output. +// Instead, manually implement +// __________________________________ Mark as structured data so it can be rendered +// / ____________________ Implement serde::Serialize +// | / _________ Implement mingling::Groupped +// | | / to ensure Mingling can recognize the type +// vvvvvvvvvvvv vvvvvvvvv vvvvvvvv +#[derive(StructuralData, Serialize, Groupped)] +struct Info { + #[serde(rename = "member_name")] + name: String, + #[serde(rename = "member_age")] + age: i32, +} +// This will output: {"member_name":"name","member_age":32} structure + +// If using pack!(Info = (String, i32)); +// Output: {"inner":["name", 32]} + +// --------- IMPORTANT --------- + +#[chain] +fn parse_render(prev: EntryRender) -> Next { + let (name, age) = Picker::new(prev.inner) + .pick::(()) + .pick::(()) + .unpack(); + Info { name, age }.to_render() +} + +/// Implement default renderer for when structural_renderer is not specified +#[renderer] +fn render_info(prev: Info) { + r_println!("{} is {} years old", prev.name, prev.age); +} + +gen_program!(); -- cgit