1 个不稳定版本

0.1.0 2020年7月15日

#906命令行界面

MIT 许可证

26KB
274

promptor

简单、函数式、单子命令行提示。

受到 Haskell 中 readMaybe 的极大启发。

一个简单的模块,用于处理用户输入和用户输入验证。

特性

  • 函数式:每个返回 Option 的方法都有一个来自 Haskell 的翻译,您可以在文档中查看。
  • 透明:只使用标准库中的 traits 并只定义了一个 trait 别名。
  • (大部分) 安全:除了 prompt()rprompt() 外的所有方法都返回 OptionResult,并使用 OptionResult 上的链式方法。
  • 可用于 stdio 之外:您可以定义一个 Promptor 对象,用于实现 BufReadWrite 的任意组合的对象。
  • 只使用您需要的:不需要验证?只需使用 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::FromStrSizedCopyDefault。这样,类型与验证器配合得很好,如果你调用 .unwrap_or_default(),则会得到合理的结果。

你也可以只使用你需要的东西:例如,如果你只需要从用户那里获取一个字符串,你只需使用 get_line() 即可。你根本不需要使用 prompt()

依赖项

~295–750KB
~18K SLoC