16 个版本 (稳定)
1.2.4 | 2024年6月2日 |
---|---|
1.1.2 | 2024年4月27日 |
1.1.0 | 2024年2月22日 |
0.4.0 | 2024年1月18日 |
0.3.0 | 2023年12月21日 |
#71 in 文本处理
2,075 每月下载量
在 4 crates 中使用
1MB
2.5K SLoC
需求
Rust 的提示库。基于 huh? for Go。由 @jdx 和 @roele 维护。
输入
- 带有可变提示和占位符的单行文本输入
- 使用
TAB
提供自动完成建议 - 使用自定义闭包验证输入
使用以下命令运行示例:cargo run --example input
。
use demand::Input;
fn main() {
let notempty_minlen = |s: &str| {
if s.is_empty() {
return Err("Name cannot be empty");
}
if s.len() < 8 {
return Err("Name must be at least 8 characters");
}
Ok(())
};
let t = Input::new("What's your name?")
.description("We'll use this to personalize your experience.")
.placeholder("Enter your name")
.prompt("Name: ")
.suggestions(vec![
"Adam Grant",
"Danielle Steel",
"Eveline Widmer-Schlumpf",
"Robert De Niro",
"Ronaldo Rodrigues de Jesus",
"Sarah Michelle Gellar",
"Yael Naim",
"Zack Snyder",
])
.validation(notempty_minlen);
let i = t.run().expect("error running input");
}
密码
使用以下命令运行示例:cargo run --example input-password
。
use demand::Input;
fn main() {
let t = Input::new("Set a password")
.placeholder("Enter password")
.prompt("Password: ")
.password(true);
let i = t.run().expect("error running input");
}
列表
显示选项列表。使用以下命令运行示例:cargo run --example list
。
use demand::List;
fn main() {
let list = List::new("Toppings")
.description("List of available toppings")
.item("Lettuce")
.item("Tomatoes")
.item("Charm Sauce")
.item("Jalapenos")
.item("Cheese")
.item("Vegan Cheese")
.item("Nutella")
.item("Peanut Butter")
.item("Banana")
.filterable(true);
list.run().expect("error running list")
}
选择
从选项列表中进行选择。
使用以下命令运行示例:cargo run --example select
。
use demand::{DemandOption, Select};
fn main() {
let ms = Select::new("Toppings")
.description("Select your topping")
.filterable(true)
.option(DemandOption::new("Lettuce"))
.option(DemandOption::new("Tomatoes"))
.option(DemandOption::new("Charm Sauce"))
.option(DemandOption::new("Jalapenos").label("Jalapeños"))
.option(DemandOption::new("Cheese"))
.option(DemandOption::new("Vegan Cheese"))
.option(DemandOption::new("Nutella"));
ms.run().expect("error running select");
}
多选
从列表中选择多个选项。使用以下命令运行示例:cargo run --example multiselect
。
use demand::{DemandOption, MultiSelect};
fn main() {
let ms = MultiSelect::new("Toppings")
.description("Select your toppings")
.min(1)
.max(4)
.filterable(true)
.option(DemandOption::new("Lettuce").selected(true))
.option(DemandOption::new("Tomatoes").selected(true))
.option(DemandOption::new("Charm Sauce"))
.option(DemandOption::new("Jalapenos").label("Jalapeños"))
.option(DemandOption::new("Cheese"))
.option(DemandOption::new("Vegan Cheese"))
.option(DemandOption::new("Nutella"));
ms.run().expect("error running multi select");
}
确认
用是或否确认一个问题。使用以下示例运行:cargo run --example confirm
.
use demand::Confirm;
fn main() {
let ms = Confirm::new("Are you sure?")
.affirmative("Yes!")
.negative("No.");
let yes = ms.run().expect("error running confirm");
}
对话框
显示带有多个按钮的对话框。使用以下示例运行:cargo run --example dialog
.
use demand::{Dialog, DialogButton};
fn main() {
let ms = Dialog::new("Are you sure?")
.description("This will do a thing.")
.buttons(vec![
DialogButton::new("Ok"),
DialogButton::new("Not sure"),
DialogButton::new("Cancel"),
])
.selected_button(1);
ms.run().expect("error running confirm");
}
旋转器
旋转器用于指示一个进程正在运行。使用以下示例运行:cargo run --example spinner
.
use std::{thread::sleep, time::Duration};
use demand::{Spinner, SpinnerStyle};
fn main() {
Spinner::new("Loading Data...")
.style(SpinnerStyle::line())
.run(|| {
sleep(Duration::from_secs(2));
})
.expect("error running spinner");
}
主题
提供您自己的自定义主题或从预定义的主题中选择。
从默认主题派生自定义主题。
let theme = Theme {
selected_prefix: String::from(" •"),
selected_prefix_fg: Theme::color_rgb(2, 191, 135),
unselected_prefix: String::from(" "),
..Theme::default()
};
Input::new("What's your e-mail?")
.description("Please enter your e-mail address.")
.placeholder("[email protected]")
.theme(&theme)
.run()
.expect("error running input")?;
基础16
魅力
如果控制台启用了颜色,则为默认。
猫爪咖啡
德古拉
新
如果控制台未启用颜色,则为默认。
"demand"
这个库的名称灵感来源于一个伟大的误译,它在1830年使美法关系恶化。在法语中,动词"demander"意为"询问"。
依赖项
~0.5–7.5MB
~43K SLoC