2 个版本

0.0.2 2021 年 8 月 26 日
0.0.1 2021 年 8 月 12 日

#809编码

MIT/Apache

45KB
643

asking

Download License Docs Crate

构建异步提示。

关于

是否想要非阻塞用户输入?这里就是了!

异步 I/O 是一种输入/输出处理方式,允许你在等待答案时做其他事情。

特性

  • 异步 - 用户输入时你可以工作,甚至可以超时!
  • 常见模式 - 内置常见问题模式,包括
    • yn - 是/否问题(见 yn 函数)。
    • date - 日期格式为 %Y-%m-%d(见 date 函数)。
    • select - 选择一个选项(见 inside 方法)。
    • text - 只是一个 String(见 text 函数)。
    • T - 你自己的类型!(实现或不实现 FromStr 特质)。
  • 跨平台 - 通用 writer 和 reader!
  • 帮助信息 - 帮助用户输入正确的答案。
  • 测试和反馈 - 测试输入,并在出错时可选地提供反馈。
  • 默认值 - 为空输入添加一个值。
  • 标准化的错误处理 - 你可以管理错误!
  • 反馈 - 根据接受的值显示最终消息。
  • 详尽的文档 - 如果你认为不是,请告诉我!

限制

  • 函数的内部可变性 - 所有函数都存储为 Arc<dyn Fn>。这允许函数和闭包,但这也意味着函数不能持有任何可变引用(因此没有内部可变性)。
  • 发送 + 同步 + 'static - 为了允许异步执行,最终所有参数都必须实现此特征。这样你才能真正利用问题的异步执行。如果你使用未实现这些特征的任何东西,那么未来只能以同步方式执行。
  • 消费方法 - 方法是消费性的,允许一行构造,同时使复杂构造模式更难。这是因为存在默认值。查看 C-BUILDER

如果你发现其他任何内容,请告诉我,我将很高兴添加它!

快速示例

只给用户五秒钟时间确认某事,如果没有输入则继续!(而不是继续等待)

use asking::error::Processing;
use std::time::Duration;

let question = asking::yn()
    .message("Shall I continue? (you have 5 seconds to answer)")
    .default_value(true) // value upon empty input
    .timeout(Duration::from_secs(5_u64))
    .ask();

match async_std::task::block_on(question) { // we decide to just wait, at most five secs
    Ok(true) => println!("Super!"),
    Ok(false) => println!("Okay, shutting down..."),
    Err(Processing::Timeout { .. }) => println!("I think you are not here, I will continue :)"), // Automatic decision!,
    _ => eprintln!("Error with questionnaire, try again later"),
}

查看更多 示例

使用方法

安装了 cargo-edit 后,只需输入

cargo add asking

即可!

有几个包用于处理用户输入,我建议查看它们全部!

  • ask - 一个通过终端提问的简单工具集。
  • dialoguer - 命令行提示库。
  • inquire - 用于在终端上构建交互式提示的库。
  • promptly - 简单、有偏见的 CLI 提示助手。
  • requestty - 易于使用的交互式 CLI 提示集合。
  • rprompt - 在控制台应用程序中提示用户输入。
  • question - 提问,你还需要什么?
  • read_input - 一个简单的 CLI 工具,它会要求用户输入,直到输入的数据有效。
  • termion::AsyncReader - 一个异步读取器。
  • timeout-readwrite - 为读取器和写入器添加超时功能。

如果你有一个适合的包,请提交一个问题并告诉我。我很乐意添加它!

良好匹配

有些包可以一起使用!

常见问题解答

测试

对具有用户输入的项目进行测试可能具有挑战性。

依赖关系

~6–16MB
~217K SLoC