1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
<p align="center">
<a href="https://github.com/mingling-rs/mingling">
<img alt="Mingling" src="https://github.com/mingling-rs/mingling/raw/main/docs/res/icon2.png" width="50%">
</a>
</p>
<h1 align="center">Mìng Lìng - 命令</h1>
<p align="center">
<b>/mɪŋ lɪŋ/</b>
</p>
<p align="center">
Macro magician in your CLI.
</p>
## Intro
[`Mingling`](https://github.com/mingling-rs/mingling) is a **proc-macro and type system-based** Rust CLI framework, suitable for developing complex command-line programs with numerous subcommands.
## Use
Here is a basic project written using **Mingling**:
- When the user types `greet`, the program outputs `Hello, World!`
- When the user types `greet Alice`, the program outputs `Hello, Alice!`
```rust
use mingling::prelude::*;
dispatcher!("greet", CMDGreet => EntryGreet);
fn main() {
let mut program = ThisProgram::new();
program.with_dispatcher(CMDGreet);
program.exec_and_exit();
}
pack!(ResultName = String);
#[chain]
fn handle_greet(args: EntryGreet) -> Next {
let name: ResultName = args
.inner
.first()
.cloned()
.unwrap_or_else(|| "World".to_string())
.into();
name
}
#[renderer]
fn render_name(name: ResultName) -> RenderResult {
let mut result = RenderResult::default();
result.println(&format!("Hello, {}!", *name));
result
}
#[renderer]
fn render_dispatcher_not_found(err: ErrorDispatcherNotFound) -> RenderResult {
let mut result = RenderResult::default();
if err.len() > 0 {
result.println(&format!("Command not found: [{}]", err.join(" ")));
}
result
}
gen_program!();
```
Output:
```text
> mycmd greet
Hello, World!
> mycmd greet Alice
Hello, Alice!
> mycmd great
Command not found: [great]
```
## Examples
`Mingling` provides detailed usage examples for your reference.
See [Examples](_mingling_examples/index.html) or [Helpdoc](https://mingling-rs.github.io/mingling/docs/examples.html)
## About Features
All features of `Mingling` are opt-in. To learn what each feature provides, see [Features](feature/index.html) or [Helpdoc](https://mingling-rs.github.io/mingling/docs/doc.html#/pages/other/features)
## Use unreleased version
If you want to use the latest development version, you can pull from the [Unreleased](https://github.com/mingling-rs/mingling/tree/unreleased) branch on [GitHub](https://github.com/mingling-rs/mingling) by adding the following to your `Cargo.toml`:
```toml
[dependencies.mingling]
git = "https://github.com/mingling-rs/mingling.git"
tag = "unreleased"
features = []
```
**Please note** that the documentation for the latest version may differ from this article. It is recommended to refer to the [latest documentation](https://mingling-rs.github.io/mingling/docs/api-docs/mingling/).
|