1 个不稳定版本
0.1.0 | 2022 年 12 月 26 日 |
---|
#739 in 命令行界面
8KB
86 行
Giveup
giveup
是一个用于封装和优雅显示 Result
的轻量级抽象,用于最终用户。
它旨在作为 expect
或 unwrap_or_else
的替代品使用,如果发生错误导致程序终止。
示例
// Here reading the config at the start of the cli app
// fails because the user has not yet created a config file.
let config = Config::read(/*config-path*/)
.hint("Create a configuration file")
.example("touch config-filename")
.giveup("Missing configuration file")
动机
在上面的场景中,expect
使用不当,因为我们不希望 CLI 的用户面对一个 panic
。
目标是显示一个易于阅读的错误消息并提供尽可能多的帮助,以便用户可以回到他们最初想要做的事情(这从来不是修复自己正在使用的工具的一些问题)。
我的通常解决方案看起来可能像这样
let config = Config::read(/*config-path*/).unwrap_or_else(|err| {
eprintln!("Missing configuration file: {}\n \
Create a new configuration file: `touch config-filename`",
err);
std::process::exit(1);
});
在这种情况下,差异并不是世界性的,但使用 unwrap_or_else
可能会非常冗长,因为会有大量的样板代码重复出现。此外,giveup
更适合使用变量进行动态错误消息。
反馈
我主要为我个人的使用编写了 giveup
,所以我非常希望得到您的 反馈。
依赖关系
~0–9.5MB
~43K SLoC