summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock558
-rw-r--r--Cargo.toml23
-rw-r--r--examples/example-basic/Cargo.toml9
-rw-r--r--examples/example-basic/src/main.rs51
-rw-r--r--examples/example-general-renderer/Cargo.toml9
-rw-r--r--examples/example-general-renderer/src/main.rs71
-rw-r--r--examples/example-picker/Cargo.toml9
-rw-r--r--examples/example-picker/src/main.rs68
-rw-r--r--src/guide.txt12
-rw-r--r--src/main.rs3
10 files changed, 813 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..8c52e7d
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,558 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 4
+
+[[package]]
+name = "bitflags"
+version = "2.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "bytes"
+version = "1.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "example-basic"
+version = "0.1.0"
+dependencies = [
+ "mingling 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde",
+ "tokio",
+]
+
+[[package]]
+name = "example-general-renderer"
+version = "0.1.0"
+dependencies = [
+ "mingling 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde",
+ "tokio",
+]
+
+[[package]]
+name = "example-picker"
+version = "0.1.0"
+dependencies = [
+ "mingling 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde",
+ "tokio",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.16.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
+
+[[package]]
+name = "indexmap"
+version = "2.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
+
+[[package]]
+name = "just_fmt"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5454cda0d57db59778608d7a47bff5b16c6705598265869fb052b657f66cf05e"
+
+[[package]]
+name = "libc"
+version = "0.2.184"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af"
+
+[[package]]
+name = "lock_api"
+version = "0.4.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "memchr"
+version = "2.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79"
+
+[[package]]
+name = "mingling"
+version = "0.1.4"
+dependencies = [
+ "mingling 0.1.4",
+ "mingling_core 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mingling_macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde",
+ "size",
+ "tokio",
+]
+
+[[package]]
+name = "mingling"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44649f30155978a64f833b8acc2ed78e79ff8e399c2476374cee874718b30575"
+dependencies = [
+ "mingling_core 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "mingling_macros 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde",
+ "size",
+]
+
+[[package]]
+name = "mingling-workspace"
+version = "0.1.0"
+
+[[package]]
+name = "mingling_cli"
+version = "0.1.0"
+dependencies = [
+ "mingling 0.1.4",
+ "serde",
+ "tokio",
+]
+
+[[package]]
+name = "mingling_core"
+version = "0.1.3"
+dependencies = [
+ "just_fmt",
+ "ron",
+ "serde",
+ "serde_json",
+ "serde_yaml",
+ "thiserror",
+ "tokio",
+ "toml",
+]
+
+[[package]]
+name = "mingling_core"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b764c83f1577a83cad7fea3dec1155da2f6e603332e9b80aac71d2ad3da974a"
+dependencies = [
+ "just_fmt",
+ "ron",
+ "serde",
+ "serde_json",
+ "serde_yaml",
+ "thiserror",
+ "tokio",
+ "toml",
+]
+
+[[package]]
+name = "mingling_macros"
+version = "0.1.3"
+dependencies = [
+ "just_fmt",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "mingling_macros"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a057b9d00ed35217f5d6ebf3cfe42e0061526cfecaf206f3e4a4f1567916e9c"
+dependencies = [
+ "just_fmt",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "mio"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1"
+dependencies = [
+ "libc",
+ "wasi",
+ "windows-sys",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
+
+[[package]]
+name = "parking_lot"
+version = "0.12.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a"
+dependencies = [
+ "lock_api",
+ "parking_lot_core",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.9.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "smallvec",
+ "windows-link",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.45"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.5.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "ron"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc"
+dependencies = [
+ "bitflags",
+ "once_cell",
+ "serde",
+ "serde_derive",
+ "typeid",
+ "unicode-ident",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.149"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
+name = "serde_spanned"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.34+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
+dependencies = [
+ "indexmap",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b"
+dependencies = [
+ "errno",
+ "libc",
+]
+
+[[package]]
+name = "size"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b6709c7b6754dca1311b3c73e79fcce40dd414c782c66d88e8823030093b02b"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "socket2"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e"
+dependencies = [
+ "libc",
+ "windows-sys",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.117"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tokio"
+version = "1.51.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd"
+dependencies = [
+ "bytes",
+ "libc",
+ "mio",
+ "parking_lot",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2",
+ "tokio-macros",
+ "windows-sys",
+]
+
+[[package]]
+name = "tokio-macros"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "toml"
+version = "0.9.12+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
+dependencies = [
+ "indexmap",
+ "serde_core",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_parser",
+ "toml_writer",
+ "winnow 0.7.15",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.7.5+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "toml_parser"
+version = "1.1.2+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
+dependencies = [
+ "winnow 1.0.1",
+]
+
+[[package]]
+name = "toml_writer"
+version = "1.1.1+spec-1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
+
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "winnow"
+version = "0.7.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
+
+[[package]]
+name = "winnow"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5"
+
+[[package]]
+name = "zmij"
+version = "1.0.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..023c9ba
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "mingling-workspace"
+version = "0.1.0"
+edition = "2024"
+
+[workspace]
+package.version = "0.1.0"
+members = [
+ "mingling",
+ "mingling_cli",
+ "mingling_core",
+ "mingling_macros",
+ "examples/example-basic",
+ "examples/example-general-renderer",
+ "examples/example-picker",
+]
+
+resolver = "2"
+
+[workspace.dependencies]
+mingling = { version = "0.1.4", features = ["full"] }
+serde = { version = "1", features = ["derive"] }
+tokio = { version = "1", features = ["rt", "rt-multi-thread", "macros"] }
diff --git a/examples/example-basic/Cargo.toml b/examples/example-basic/Cargo.toml
new file mode 100644
index 0000000..eb10e2a
--- /dev/null
+++ b/examples/example-basic/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "example-basic"
+version.workspace = true
+edition = "2024"
+
+[dependencies]
+mingling.workspace = true
+tokio.workspace = true
+serde.workspace = true
diff --git a/examples/example-basic/src/main.rs b/examples/example-basic/src/main.rs
new file mode 100644
index 0000000..050bfd4
--- /dev/null
+++ b/examples/example-basic/src/main.rs
@@ -0,0 +1,51 @@
+//! `Mingling` Example - Basic
+//!
+//! # How to Run
+//! ```bash
+//! cargo run --manifest-path ./examples/example-basic/Cargo.toml -- hello World
+//! ```
+
+use mingling::{
+ macros::{chain, dispatcher, gen_program, pack, r_println, renderer},
+ marker::NextProcess,
+};
+
+// Define dispatcher `HelloCommand`, directing subcommand "hello" to `HelloEntry`
+dispatcher!("hello", HelloCommand => HelloEntry);
+
+#[tokio::main]
+async fn main() {
+ // Create program
+ let mut program = DefaultProgram::new();
+
+ // Add dispatcher `HelloCommand`
+ program.with_dispatcher(HelloCommand);
+
+ // Run program
+ program.exec().await;
+}
+
+// Register wrapper type `Hello`, setting inner to `String`
+pack!(Hello = String);
+
+// Register chain to `DefaultProgram`, handling logic from `HelloEntry`
+#[chain]
+async fn parse_name(prev: HelloEntry) -> NextProcess {
+ // Extract string from `HelloEntry` as argument
+ let name = prev.first().cloned().unwrap_or_else(|| "World".to_string());
+
+ // Build `Hello` type and route to renderer
+ Hello::new(name).to_render()
+}
+
+// Register renderer to `DefaultProgram`, handling rendering of `Hello`
+#[renderer]
+fn render_hello_who(prev: Hello) {
+ // Print message
+ r_println!("Hello, {}!", *prev);
+
+ // Program ends here
+}
+
+// Generate program, default is `DefaultProgram`
+gen_program!();
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!();
diff --git a/examples/example-picker/Cargo.toml b/examples/example-picker/Cargo.toml
new file mode 100644
index 0000000..2e514f7
--- /dev/null
+++ b/examples/example-picker/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "example-picker"
+version.workspace = true
+edition = "2024"
+
+[dependencies]
+mingling.workspace = true
+tokio.workspace = true
+serde.workspace = true
diff --git a/examples/example-picker/src/main.rs b/examples/example-picker/src/main.rs
new file mode 100644
index 0000000..24357a8
--- /dev/null
+++ b/examples/example-picker/src/main.rs
@@ -0,0 +1,68 @@
+//! `Mingling` Example - Picker
+//!
+//! ## Step1 - Enable Feature
+//! Enable the `parser` feature for mingling in `Cargo.toml`
+//! ```toml
+//! [dependencies]
+//! mingling = { version = "...", features = ["parser"] }
+//! ```
+//!
+//! ## Step2 - Write Code
+//! Write the following content into `main.rs`
+//!
+//! ## Step3 - Build and Run
+//! ```bash
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick Bob
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick Bob --age -15
+//! cargo run --manifest-path ./examples/example-picker/Cargo.toml -- pick --age 99
+//! ```
+
+use mingling::{
+ AnyOutput,
+ macros::{chain, dispatcher, gen_program, pack, r_println, renderer},
+ marker::NextProcess,
+ parser::Picker,
+};
+
+dispatcher!("pick", PickCommand => PickEntry);
+
+#[tokio::main]
+async fn main() {
+ let mut program = DefaultProgram::new();
+ program.with_dispatcher(PickCommand);
+ program.exec().await;
+}
+
+pack!(NoNameProvided = ());
+pack!(ParsedPickInput = (i32, String));
+
+#[chain]
+async fn parse(prev: PickEntry) -> NextProcess {
+ // Extract arguments from `PickEntry`'s inner and create a `Picker`
+ let picker = Picker::new(prev.inner);
+ let picked = picker
+ // First extract the named argument
+ .pick_or("--age", 20)
+ .after(|n: i32| n.clamp(0, 100))
+ // Then sequentially extract the remaining arguments
+ .pick_or_route((), AnyOutput::new(NoNameProvided::default()))
+ .unpack();
+
+ match picked {
+ Ok(value) => ParsedPickInput::new(value).to_render(),
+ Err(e) => e.route_renderer(),
+ }
+}
+
+#[renderer]
+fn render_parsed_pick_input(prev: ParsedPickInput) {
+ let (age, name) = prev.inner;
+ r_println!("Picked: name = {}, age = {}", name, age);
+}
+
+#[renderer]
+fn render_no_name_input(_prev: NoNameProvided) {
+ r_println!("No name provided.");
+}
+
+gen_program!();
diff --git a/src/guide.txt b/src/guide.txt
new file mode 100644
index 0000000..1cac233
--- /dev/null
+++ b/src/guide.txt
@@ -0,0 +1,12 @@
+ ┌────────────────────────────────────┐
+ │ Mingling │
+ │ The Rust CLI Framework │
+ │ │
+ │ USE: │
+ │ Run command in your project │
+ │ > cargo add mingling │
+ │ │
+ │ Or add this to your Cargo.toml │
+ │ > mingling = "0.1.4" │
+ │ │
+ └────────────────────────────────────┘
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..ed3de5b
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("{}", include_str!("./guide.txt").trim_end_matches("\n"));
+}