Input

Input用于接收用户的文本或数字输入。

定义Input字段

使用dialogue_macro::Asker宏为结构体派生trait时,框架会自动将以下字段类型识别为Input输入字段:

  • String
  • 基本数字类型,如i32u32usize

如果某个字段为非必填项,可将其声明为Option<String>或对应的Option<数字类型>。这样在调用finish()方法时,如果没有调用该同名方法,程序不会panic。

配置选项

  • prompt: 指定提示用户输入信息的文本内容。
  • default: 设置字段的默认值,在询问用户时显示该默认值供参考或直接采用。
  • with_default: 布尔值参数,当设为true时,在调用相应方法时需要传递默认值。
  • validate_with: 指定验证函数,验证用户输入的值是否符合要求。

示例

在以下的 Rust 代码示例中,我们利用 dialogue_macro 库来实现一个用户交互式信息收集的场景。定义了一个结构体 User,它包含四个字段:nameemailageschool,分别用于收集用户的姓名、电子邮件地址、年龄和学校信息。

#![allow(unused)]
use dialogue_macro::Asker;

#[derive(Asker, Debug)]
struct User {
    name: Option<String>,
    #[input(prompt = "请输入您的邮箱地址: ", with_default = true)]
    email: String,
    #[input(with_default = true)]
    age: u8,
    #[input(
        prompt = "请输入您的学校名称: ",
        with_default = true,
        validate_with = |input| {
            if input.contains("大学") { Ok(()) } else { Err("学校名称必须包含大学") }
        }
    )]
    school: Option<String>,
}

fn main() {
    let user = User::asker()
        .name("请输入您的姓名: ")
        .email("yexiyue666@qq.com")
        .age("请输入您的年龄", 17)
        .school("北京大学")
        .finish();

    println!("{:?}", user);
}

image-20240316141307176

在上述示例中:

  • name 字段是一个可选字符串类型,用户可以选择是否输入姓名。
  • email 字段要求用户输入电子邮件地址,并支持传入默认值,通过 .email() 方法传递。
  • age 字段用于获取用户年龄,也支持默认值,此处默认值为17岁。
  • school 字段允许用户输入学校名称,同时提供了默认值"清华大学"。

main 函数中:

  • 我们初始化了 User 结构体的询问器实例,并为每个字段指定了相应的提示信息和/或默认值。
  • 当运行程序时,将按照定义顺序逐个展示各个字段的提示信息,并依据是否设置了默认值进行交互式信息收集。
  • 收集完成后,user.finish() 返回一个包含了用户输入信息的 User 结构体实例,并将其输出至控制台。