aboutsummaryrefslogtreecommitdiff
path: root/docs/_zh_CN/pages/10-help.md
blob: 7b565572559e58949853f28a3c934469793faa00 (plain) (blame)
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
<h1 align="center">帮助信息</h1>
<p align="center">
    为命令添加 --help 支持
</p>

没有帮助信息的 CLI 不是好 CLI。

Mingling 里用 `#[help]` 宏给命令添加帮助文本。

## 最简单的帮助

直接给 Entry 写一个帮助函数:

```rust
@@@use mingling::macros::help;
@@@dispatcher!("greet", CMDGreet => EntryGreet);
#[help]
fn help_greet(_entry: EntryGreet) {
    r_println!("Usage: greet [name]");
    r_println!("Say hello to someone.");
}
```
 
> [!NOTE]
> 帮助函数里也用 `r_println!`,因为 `#[help]` 走的也是渲染流程 —— 它是被 `--help` 参数提前触发的短路渲染,不是独立于管线之外的逻辑。

## 全局帮助

你也可以为 `ErrorDispatcherNotFound` 写帮助,作为"根帮助":

```rust
@@@use mingling::macros::help;
// 用户直接输入 --help 时触发
#[help]
fn help_root(entry: ErrorDispatcherNotFound) {
    r_println!("Usage: my-cli <command>");
    r_println!("Commands:");
    r_println!("  greet    Say hello");
}
```
 
> [!TIP]
> `ErrorDispatcherNotFound` 是 `gen_program!()` 自动生成的类型,代表"没有匹配到任何命令"的情况。为它写 `#[help]` 就是给程序的根命令加帮助。

## 需要 Setup 配合

要让 `--help` 正常工作,需要在 `main` 里加上 `BasicProgramSetup````rust
@@@use mingling::macros::help;
@@@use mingling::setup::BasicProgramSetup;
@@@dispatcher!("greet", CMDGreet => EntryGreet);
fn main() {
    let mut program = ThisProgram::new();
    program.with_setup(BasicProgramSetup);
    program.with_dispatcher(CMDGreet);
    program.exec_and_exit();
}
```
 
`BasicProgramSetup` 内置了 `HelpFlagSetup`,它的作用仅仅是把 `program.user_context.help` 设为 `true`。

真正把请求路由到 `#[help]` 函数的是 `gen_program!()` 生成的代码 —— 它在调度时检查这个标记,如果为 `true` 就走帮助渲染路径,不经过 Chain。

不加 `BasicProgramSetup` 的话,`--help` 只是一个普通参数,会被当成 Entry 的输入传给 Chain。

<p align="center" style="font-size: 0.85em; color: gray;">
    Written by @Weicao-CatilGrass
</p>