Rust: 🚀 对话宏框架 dialoguer-macro 0.3 版本震撼发布

🚀 对话宏框架 dialoguer-macro 0.3 版本震撼发布:引领命令行交互设计新篇章

🎉 尊敬的开发者们,今天我怀着无比激动的心情向大家隆重推荐 dialoguer-macro 库的最新力作——0.3版本!这一版本的重大更新将彻底颠覆您对命令行用户交互设计的传统认知。我们已在新版本中倾情引入了对枚举类型和嵌套结构的强大支持,让您轻松构建出层次分明、结构优雅的命令行交互界面!

📚 文档教程直通车yexiyue.github.io/dialogue-ma…

🎯 实战演示开篇

在这篇博客中,我们将通过一个鲜活具体的实例来揭示如何运用 dialoguer-macro 0.3 中 SubAsker 属性及其关联的 AskerBuildEnumAsker 特质,打造一套高效且易用的命令行信息收集流程。

让我们一睹为快!

首先,定义了一个名为 UserInput 的结构体,并利用 #[derive(Asker)]#[asker(theme = "...")] 宏对其进行装饰,从而实现既美观又功能丰富的命令行输入界面。

值得注意的是,结构体中的 detailed_infoidentity 字段都应用了 #[asker(SubAsker)] 标记,这表示它们将以子询问器(SubAsker)的角色逐层深入地获取用户输入数据:

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

#[derive(Debug, Asker)]
#[asker(theme = "dialogue_macro::ColorfulTheme")]
struct UserInput {
    // 基础信息字段
    username: String,
    educational_institution: String,

    // 使用 SubAsker 收集详细用户信息
    #[asker(SubAsker)]
    detailed_info: DetailedUserInfo,

    // 使用 SubAsker 进行身份选择
    #[asker(SubAsker)]
    identity: EnumSelection,
}

接下来,我们精心设计了两个用于嵌套询问的数据结构:

DetailedUserInfo 结构体,封装了用户的电子邮件地址和年龄属性。为了适应 SubAsker 的工作方式,此结构体不仅实现了 DebugCloneAsker 特性,还额外实现了 Build 特质,并在 impl Build for DetailedUserInfo 中定义了 .build() 方法,以便按序从用户那里获取邮箱地址和年龄:

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

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

EnumSelection 枚举,包含了 Teacher、Student 和 Leader 三个选项。该枚举除了实现了 DebugClone 特质外,还派生了 EnumAsker 特质,这意味着它能够以清晰直观的方式呈现在用户面前供其选择:

#[derive(Debug, EnumAsker, Clone)]
#[asker(prompt="请选择您的身份", default="Student")]
enum EnumSelection {
    Teacher,
    Student,
    Leader,
}

最后,在主函数中,我们创建并实例化了 UserInput 对象,并按照逻辑顺序依次调用各个字段对应的询问方法:

fn main() {
    let collected_user_input = UserInput::asker()
        .username("请输入用户名")
        .educational_institution("请输入您的学校名称")

        // 调用 SubAsker 收集详细的用户信息
        .detailed_info()

        // 调用另一个 SubAsker 让用户从枚举选项中做出选择
        .identity()

        // 收集所有用户输入并结束询问过程
        .finish();

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

当运行程序时,用户会按照预设的层级顺序逐一回答问题,体验到一种既复杂又有条不紊的命令行交互之旅!

通过上述实例代码,我们展示了如何运用 SubAsker 等特性轻松实现层次分明的命令行交互设计。如果您对这个库的功能感到兴奋,并希望在您的项目中尝试这些创新功能,请立即前往我们的 GitHub 仓库地址:

👉 GitHub 项目主页github.com/yexiyue/dia…

在此,诚挚邀请您关注我的项目、尝试使用新版 dialoguer-macro,并参与到项目的成长中来。只需点击仓库页面上的 “Star” 按钮,即可给予我宝贵的肯定与支持。同时,我也热切期待您的反馈、贡献以及实际应用案例分享!

原文链接:https://juejin.cn/post/7346897828688101403 作者:红尘散仙

(0)
上一篇 2024年3月17日 上午10:06
下一篇 2024年3月17日 上午10:17

相关推荐

发表回复

登录后才能评论