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 | |
| parent | e68e1230d4157c32592900372699411c7151b4e5 (diff) | |
Add workspace configuration and examples
| -rw-r--r-- | Cargo.lock | 558 | ||||
| -rw-r--r-- | Cargo.toml | 23 | ||||
| -rw-r--r-- | examples/example-basic/Cargo.toml | 9 | ||||
| -rw-r--r-- | examples/example-basic/src/main.rs | 51 | ||||
| -rw-r--r-- | examples/example-general-renderer/Cargo.toml | 9 | ||||
| -rw-r--r-- | examples/example-general-renderer/src/main.rs | 71 | ||||
| -rw-r--r-- | examples/example-picker/Cargo.toml | 9 | ||||
| -rw-r--r-- | examples/example-picker/src/main.rs | 68 | ||||
| -rw-r--r-- | src/guide.txt | 12 | ||||
| -rw-r--r-- | src/main.rs | 3 |
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")); +} |
