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 文本处理

Download history 463/week @ 2024-05-04 2093/week @ 2024-05-11 1345/week @ 2024-05-18 1166/week @ 2024-05-25 934/week @ 2024-06-01 401/week @ 2024-06-08 464/week @ 2024-06-15 194/week @ 2024-06-22 409/week @ 2024-06-29 460/week @ 2024-07-06 764/week @ 2024-07-13 440/week @ 2024-07-20 796/week @ 2024-07-27 330/week @ 2024-08-03 365/week @ 2024-08-10 527/week @ 2024-08-17

2,075 每月下载量
4 crates 中使用

MIT 许可证

1MB
2.5K SLoC

需求

Crates.io docs.rs GitHub License GitHub Workflow Status GitHub issues

Rust 的提示库。基于 huh? for Go。由 @jdx@roele 维护。

输入

  • 带有可变提示和占位符的单行文本输入
  • 使用 TAB 提供自动完成建议
  • 使用自定义闭包验证输入

使用以下命令运行示例:cargo run --example input

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

Input

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

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

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

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.

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.

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.

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

base16

魅力

如果控制台启用了颜色,则为默认。

charm

猫爪咖啡

catppuccin

德古拉

dracula

如果控制台未启用颜色,则为默认。

new

"demand"

这个库的名称灵感来源于一个伟大的误译,它在1830年使美法关系恶化。在法语中,动词"demander"意为"询问"。

依赖项

~0.5–7.5MB
~43K SLoC