Derive Macro Asker

Source
#[derive(Asker)]
{
    // Attributes available to this derive:
    #[input]
    #[confirm]
    #[password]
    #[select]
    #[multiselect]
    #[asker]
}
Expand description

§Asker 属性宏

Asker属性宏提供了一种便捷的方式来实现用户交互式输入,支持以下五种属性宏:

  1. input
  2. confirm
  3. password
  4. select
  5. multiselect

§Input

input属性宏用于创建输入框。可以通过prompt属性设置提示信息,并通过default属性设置默认值。

示例

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

#[derive(Asker, Debug)]
struct User {
    name: String,
    #[input(prompt = "请输入您的邮箱地址: ")]
    email: String,
    #[input(default = 16)]
    age: u8,
    #[input(prompt = "请输入您的学校: ", default = "清华大学")]
    school: Option<String>,
}

fn main() {
    let user = User::asker()
        .name("请输入您的姓名: ")
        .email()
        .age("请输入您的年龄: ")
        .school()
        .finish();

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

§Confirm

confirm属性宏用于创建确认对话框,允许用户选择是/否。通过prompt属性设置询问内容,也可以通过default属性预设默认值。

示例

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

#[derive(Asker, Debug)]
struct User {
    boy: bool,
    #[confirm(prompt = "您是否是学生?")]
    student: Option<bool>,
}

fn main() {
    let user = User::asker().boy("您是男孩吗?").student().finish();
    println!("{:?}", user);
}

§Password

password属性宏用于创建密码输入框,可以设置prompt属性来定义初始密码输入提示,confirmation属性用来设置再次确认密码的提示,以及在两次输入不一致时显示的mismatch提示信息。

示例

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

#[derive(Asker, Debug)]
struct User {
    #[password()]
    password: Option<String>,
    #[password(
        prompt = "请输入您的密码:",
        confirmation = "请再次输入您的密码:",
        mismatch = "您的密码不匹配"
    )]
    password2: String,
}

fn main() {
    let user = User::asker().password2().password("请输入您的密码:").finish();
    println!("{:?}", user);
}

§Select

select属性宏用于创建下拉选择框,通过prompt属性设置提示语,options属性定义可选项列表,并可通过default属性设置默认选中项。

示例

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

#[derive(Asker, Debug)]
struct User {
    #[select(prompt = "请选择您的性别", options = ["男", "女", "其他"], default = 1)]
    sex: String,
    #[select(prompt = "请选择您的学校: ", default = 1,options=[
        School{
            name: "清华大学".to_string(),
        },
        School{
            name: "北京大学".to_string(),
        },
        School{
            name: "河南理工大学".to_string(),
        }
    ])]
    school: Option<School>,
}

#[derive(Debug, Clone)]
struct School {
    name: String,
}

impl ToString for School {
    fn to_string(&self) -> String {
        self.name.clone()
    }
}

fn main() {
    let user = User::asker().sex().school().finish();

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

§MultiSelect

multiselect属性宏用于创建多选框,用户可以从多个选项中进行选择。同样通过prompt属性设置提示语,options属性定义可选项列表,default属性设置默认已选中的项。

示例

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

#[derive(Asker, Debug)]
struct User {
    #[multiselect(prompt = "请选择您的兴趣爱好", options = ["吃", "睡", "编程"], default=[1])]
    favorite: Vec<String>,
    #[multiselect(prompt = "请选择您的学校: ", default = [1,2],options=[
        School{
            name: "清华大学".to_string(),
        },
        School{
            name: "北京大学".to_string(),
        },
        School{
            name: "河南理工大学".to_string(),
        }
    ])]
    school: Vec<School>,
}

#[derive(Debug, Clone)]
struct School {
    name: String,
}

impl ToString for School {
    fn to_string(&self) -> String {
        self.name.clone()
    }
}

fn main() {
    let user = User::asker().school().favorite().finish();

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