Build

Trait Build 

Source
pub trait Build {
    // Required method
    fn build() -> Self;
}
Expand description

§Build Trait

  • 构造方法封装: Build trait 需要在实现了它的结构体或枚举中提供 .build() 方法,这个方法会启动并执行所有需要收集用户输入的操作。
  • 嵌套与递归: 当结构体或枚举中的某个字段使用了 SubAsker 特性时,表明该字段也是一个实现了 Build trait 的类型。通过调用 .build() 方法,可以递归地收集这些嵌套结构中的信息。
  • 简化输入流程: 使用 Build trait 可以避免逐个调用每个字段对应的 .asker() 和 .finish() 方法,而是通过一次 .build() 调用来完成整个对象实例化过程,使得代码更简洁且易于管理。
  • 统一接口: 所有作为子询问器使用的结构体都需要实现 Build trait,这保证了不同层次的对象都能遵循一致的构建逻辑。

§Example

#![allow(unused)]

use dialogue_macro::{Asker, Build, EnumAsker};

#[derive(Debug, Asker)]
#[asker(theme = "dialogue_macro::ColorfulTheme")]
struct UserInput {
    username: String,
    is_student_status: bool,
    educational_institution: String,

    #[asker(SubAsker)]
    detailed_info: DetailedUserInfo,
    #[asker(SubAsker)]
    choice: EnumSelection,
}

#[derive(Debug, Clone, Asker)]
struct DetailedUserInfo {
    email_address: String,
    age: u8,
}

#[derive(Debug, EnumAsker, Clone)]
enum EnumSelection {
    OptionD,
    OptionE,
    OptionF,
}

impl Build for DetailedUserInfo {
    fn build() -> Self {
        Self::asker()
            .email_address("请提供您的邮箱地址")
            .age("请输入您的年龄")
            .finish()
    }
}

fn main() {
    let collected_user_input = UserInput::asker()
        .username("请输入用户名")
        .is_student_status("您是否是学生身份?")
        .educational_institution("请输入您的学校名称")
        .detailed_info()
        .choice()
        .finish();

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

Required Methods§

Source

fn build() -> Self

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§