summaryrefslogtreecommitdiff
path: root/examples/example-general-renderer
diff options
context:
space:
mode:
Diffstat (limited to 'examples/example-general-renderer')
-rw-r--r--examples/example-general-renderer/Cargo.toml9
-rw-r--r--examples/example-general-renderer/src/main.rs71
2 files changed, 80 insertions, 0 deletions
diff --git a/examples/example-general-renderer/Cargo.toml b/examples/example-general-renderer/Cargo.toml
new file mode 100644
index 0000000..22403a2
--- /dev/null
+++ b/examples/example-general-renderer/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "example-general-renderer"
+version.workspace = true
+edition = "2024"
+
+[dependencies]
+mingling.workspace = true
+tokio.workspace = true
+serde.workspace = true
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!();