Rust命令行工具库promptly的使用:快速构建交互式用户输入提示功能

Rust命令行工具库promptly的使用:快速构建交互式用户输入提示功能

promptly是一个简单但功能强大的Rust命令行提示库,具有以下特点:

  • 输入无效时会重新提示用户
  • 支持多种类型的输入提示,并且可扩展
  • 通过rustyline处理转义字符
  • 提示路径输入时提供路径补全功能
  • 使用非常简单

使用方法

只需调用promptprompt_default来提示任何Promptable类型的输入:

  • prompt(msg) - 持续提示直到输入可以被解析为推断的返回类型。如果输入为空会重新提示
  • prompt_opt(msg) - 持续提示直到输入可以被解析为推断的返回类型。如果输入为空则返回None
  • prompt_default(msg, default) - 持续提示直到输入可以被解析为推断的返回类型。如果输入为空则使用默认值

完整示例代码

use promptly::{prompt, prompt_default, prompt_opt};
use std::path::PathBuf;
use url::Url;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 基本字符串输入
    let name: String = prompt("请输入您的姓名")?;
    println!("您好, {}!", name);

    // 数字输入
    let age: u32 = prompt("请输入您的年龄")?;
    println!("您今年{}岁", age);

    // 可选路径输入
    let photo: Option<PathBuf> = prompt_opt("请输入个人照片路径(可选)")?;
    if let Some(path) = photo {
        println!("选择的照片路径: {}", path.display());
    } else {
        println!("未提供照片路径");
    }

    // 带默认值的布尔输入
    let subscribe = prompt_default("是否订阅我们的新闻邮件?(Y/n)", true);
    println!("订阅状态: {}", subscribe);

    // URL输入
    let website: Url = prompt("请输入您的网站URL")?;
    println!("网站URL: {}", website);

    // 组合使用
    println!("\n--- 用户信息摘要 ---");
    println!("姓名: {}", name);
    println!("年龄: {}", age);
    println!("订阅新闻邮件: {}", subscribe);
    println!("网站: {}", website);
    if let Some(path) = photo {
        println!("照片: {}", path.display());
    }

    Ok(())
}

依赖配置

要运行这个示例,需要在Cargo.toml中添加以下依赖:

[dependencies]
promptly = "0.3.1"
url = "2.2"  # 如果需要URL功能

扩展示例

下面是一个更复杂的用户注册示例,展示了promptly的更多用法:

use promptly::{prompt, prompt_default, prompt_opt};
use std::path::PathBuf;
use url::Url;

#[derive(Debug)]
struct UserProfile {
    name: String,
    age: u32,
    email: String,
    website: Option<Url>,
    avatar: Option<PathBuf>,
    is_subscribed: bool,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("=== 用户注册系统 ===");
    
    // 收集用户信息
    let profile = UserProfile {
        name: prompt("请输入您的全名")?,
        age: prompt("请输入您的年龄")?,
        email: prompt("请输入您的电子邮箱")?,
        website: prompt_opt("请输入您的个人网站(可选)")?,
        avatar: prompt_opt("请上传头像图片路径(可选)")?,
        is_subscribed: prompt_default("是否订阅周刊?(Y/n)", true),
    };

    // 显示注册摘要
    println!("\n=== 注册信息确认 ===");
    println!("姓名: {}", profile.name);
    println!("年龄: {}", profile.age);
    println!("邮箱: {}", profile.email);
    
    if let Some(url) = &profile.website {
        println!("网站: {}", url);
    }
    
    if let Some(path) = &profile.avatar {
        println!("头像路径: {}", path.display());
    }
    
    println!("订阅状态: {}", profile.is_subscribed);

    println!("\n注册完成!");
    Ok(())
}

这个库的API设计是经过深思熟虑的,但也欢迎新的想法和建议。


1 回复

Rust命令行工具库promptly的使用:快速构建交互式用户输入提示功能

promptly是一个轻量级的Rust库,专门用于在命令行应用程序中快速实现用户交互式输入提示功能。它提供了简单直观的API来获取用户输入,并支持基本的输入验证。

安装

Cargo.toml中添加依赖:

[dependencies]
promptly = "0.3"

基本使用方法

1. 简单的文本输入

use promptly::prompt;

fn main() -> std::io::Result<()> {
    let name: String = prompt("What's your name")?;
    println!("Hello, {}!", name);
    Ok(())
}

2. 带默认值的输入

use promptly::prompt_default;

fn main() -> std::io::Result<()> {
    let language = prompt_default("Your favorite programming language", "Rust")?;
    println!("Great choice: {}!", language);
    Ok(())
}

高级功能

1. 输入验证

use promptly::{prompt, Validation};

fn main() -> std::io::Result<()> {
    let age: u32 = prompt(
        "How old are you",
        Validation::from(|input: &str| -> Result<u32, String> {
            input.parse().map_err(|_| "Please enter a valid number".to_string())
        }),
    )?;
    
    println!("You are {} years old", age);
    Ok(())
}

2. 密码输入(隐藏输入)

use promptly::prompt_password;

fn main() -> std::io::Result<()> {
    let password = prompt_password("Enter your password")?;
    println!("Your password is {} characters long", password.len());
    Ok(())
}

3. 确认提示(是/否)

use promptly::prompt_yes_no;

fn main() -> std::io::Result<()> {
    let answer = prompt_yes_no("Do you like Rust", Some(true))?;
    if answer {
        println!("Great!");
    } else {
        println!("Maybe you'll change your mind later!");
    }
    Ok(())
}

自定义提示符

use promptly::{prompt_with_options, PromptOptions};

fn main() -> std::io::Result<()> {
    let options = PromptOptions::new()
        .default("Rust")
        .placeholder("[your language]");
    
    let language: String = prompt_with_options("Favorite language", options)?;
    println!("You chose: {}", language);
    Ok(())
}

处理错误

use promptly::prompt;

fn main() {
    match prompt::<String, _>("Enter something") {
        Ok(input) => println!("You entered: {}", input),
        Err(e) => eprintln!("Error: {}", e),
    }
}

完整示例代码

下面是一个综合使用promptly各种功能的完整示例:

use promptly::{
    prompt, prompt_default, prompt_password, prompt_yes_no, 
    prompt_with_options, PromptOptions, Validation
};

fn main() -> std::io::Result<()> {
    // 1. 简单文本输入
    let name: String = prompt("请输入您的姓名")?;
    println!("您好, {}!", name);

    // 2. 带默认值的输入
    let language = prompt_default("请输入您喜欢的编程语言", "Rust")?;
    println!("很棒的选择: {}!", language);

    // 3. 输入验证(年龄)
    let age: u32 = prompt(
        "请输入您的年龄",
        Validation::from(|input: &str| -> Result<u32, String> {
            input.parse()
                .map_err(|_| "请输入有效的数字".to_string())
                .and_then(|n| if n > 0 && n < 150 {
                    Ok(n) 
                } else {
                    Err("请输入合理的年龄(0-150)".to_string())
                })
        }),
    )?;
    println!("您今年 {} 岁", age);

    // 4. 密码输入(隐藏)
    let password = prompt_password("请输入密码")?;
    println!("您的密码长度为 {} 个字符", password.len());

    // 5. 确认提示
    let answer = prompt_yes_no("您喜欢Rust吗", Some(true))?;
    if answer {
        println!("太棒了!");
    } else {
        println!("也许您以后会改变主意!");
    }

    // 6. 自定义提示选项
    let options = PromptOptions::new()
        .default("Rust")
        .placeholder("[输入语言]");
    
    let lang: String = prompt_with_options("选择您喜欢的语言", options)?;
    println!("您选择了: {}", lang);

    Ok(())
}

这个完整示例展示了promptly库的主要功能:

  1. 基本文本输入
  2. 带默认值的输入
  3. 带验证的输入
  4. 密码输入
  5. 确认提示
  6. 自定义提示选项

您可以根据实际需求选择使用这些功能来构建交互式命令行应用程序。

回到顶部