blob: 7c55b609524deffda0eeca373f4a0a2bace834c8 (
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
70
|
<h1 align="center">退出码控制</h1>
<p align="center">
如何使用资源系统管理程序退出码
</p>
程序退出时给 shell 一个正确的退出码是 CLI 的基本素养
。Mingling 提供了开箱即用的 `ExitCodeSetup`,配合 `ResExitCode` 资源,让退出码控制变得极其简单。
## 启用 ExitCodeSetup
```rust
@@@use mingling::prelude::*;
@@@use mingling::setup::ExitCodeSetup;
fn main() {
let mut program = ThisProgram::new();
program.with_setup(ExitCodeSetup::default());
@@@ program.exec_and_exit();
}
```
`ExitCodeSetup` 做了两件事:
1. 注册 `ResExitCode` 资源(默认值为 `0`)
2. 注册一个 `finish` hook,在程序退出前读取 `ResExitCode` 的值作为最终退出码
## 修改退出码
在 Chain 或 Renderer 中通过 `ResExitCode` 注入来修改退出码:
```rust
@@@use mingling::res::ResExitCode;
@@@use mingling::setup::ExitCodeSetup;
@@@pack!(EntryCheck = Vec<String>);
#[chain]
fn handle_check(_args: EntryCheck, ec: &mut ResExitCode) {
// 检查失败的时候修改退出码资源
ec.exit_code = 1;
}
```
> [!TIP]
> `ResExitCode` 就是一个 `struct ResExitCode { pub exit_code: i32 }`。`&mut ResExitCode` 注入后直接改字段即可。
## `Program` 的三种执行方式
`Program` 提供了三种执行方式(不包括 `repl` 特性下的 `exec_repl`):
| 方式 | 行为 |
| ------------------------------- | -------------------------------------------------------------------------- |
| `program.exec_and_exit()` | 执行并直接以退出码终止进程 |
| `program.exec()` | 执行后返回 `i32` 退出码,由调用方决定怎么处理 |
| `program.exec_without_render()` | 返回 `Result<RenderResult, ProgramExecuteError>`,可读取内部的 `exit_code` |
```rust
@@@use mingling::setup::ExitCodeSetup;
fn main() {
let mut program = ThisProgram::new();
program.with_setup(ExitCodeSetup::default());
// 获取退出码自行处理
let exit_code = program.exec();
std::process::exit(exit_code);
}
@@@gen_program!();
```
<p align="center" style="font-size: 0.85em; color: gray;">
Written by @Weicao-CatilGrass
</p>
|