Rust命令行工具库promptly的使用:快速构建交互式用户输入提示功能
Rust命令行工具库promptly的使用:快速构建交互式用户输入提示功能
promptly是一个简单但功能强大的Rust命令行提示库,具有以下特点:
- 输入无效时会重新提示用户
- 支持多种类型的输入提示,并且可扩展
- 通过rustyline处理转义字符
- 提示路径输入时提供路径补全功能
- 使用非常简单
使用方法
只需调用prompt
或prompt_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 回复