1 个不稳定版本
0.1.0 | 2020年7月15日 |
---|
#906 在 命令行界面
26KB
274 行
promptor
简单、函数式、单子命令行提示。
受到 Haskell 中 readMaybe
的极大启发。
一个简单的模块,用于处理用户输入和用户输入验证。
特性
- 函数式:每个返回
Option
的方法都有一个来自 Haskell 的翻译,您可以在文档中查看。 - 透明:只使用标准库中的 traits 并只定义了一个 trait 别名。
- (大部分) 安全:除了
prompt()
和rprompt()
外的所有方法都返回Option
或Result
,并使用Option
和Result
上的链式方法。 - 可用于 stdio 之外:您可以定义一个
Promptor
对象,用于实现BufRead
和Write
的任意组合的对象。 - 只使用您需要的:不需要验证?只需使用
input()
。只需要一个字符串?只需使用get_line()
。
用法
假设您想通过 stdin
从用户那里获取一个在闭区间 [1, 100] 内的数字。要使用 Promptor 做到这一点,您首先定义 Promptor 对象,然后调用其上的 prompt()
方法,如下所示
use promptor::Promptor;
let stdio = std::io::stdin();
let input = stdio.lock();
let output = std::io::stdout();
let mut promptor = Promptor {
reader: input,
writer: output
};
let res: u32 = promptor.prompt("Please enter a number between 1 and 100: ", |x| 1 <= x && x <= 100);
如果您只需要一个字符串,可以使用 get_line()
代替
use promptor::Promptor;
let stdio = std::io::stdin();
let input = stdio.lock();
let output = std::io::stdout();
let mut promptor = Promptor {
reader: input,
writer: output
};
let name = promptor.get_line("What is your name? ").unwrap();
动机
这是几个月来研究多种语言中错误处理的结晶。在学习了 Haskell 中的单调错误处理并将其应用于几种其他语言后,我发现 Rust 与 std::str::FromStr
特性相结合,在 Haskell 实现中最为接近。
我还发现,其他类似库并不完全符合我的需求:它们要么太复杂,要么太不透明,或者没有在内部进行验证。因此,我制作了这个库,它是一个简单直接的提示库,包含一个 prompt()
方法,允许进行验证。我在这个库中做的所有事情都接近 Rust 标准库。
此外,多亏了依赖注入,你甚至可以用这个库来做不仅仅是 stdin/stdout 的事情。例如,你可以从文件中读取输入。
同时,我尽量使错误处理合理:你可以使用返回 Option
的方法忽略内部错误,或者你可以使用 Result
版本来决定如何处理错误。
我的库不使用任何特殊的特质;正如你所见,SafeParsable
仅使用 std::str::FromStr
、Sized
、Copy
和 Default
。这样,类型与验证器配合得很好,如果你调用 .unwrap_or_default()
,则会得到合理的结果。
你也可以只使用你需要的东西:例如,如果你只需要从用户那里获取一个字符串,你只需使用 get_line()
即可。你根本不需要使用 prompt()
。
依赖项
~295–750KB
~18K SLoC