Rust终端颜色与CLI参数解析库concolor-clap的使用,实现命令行应用的美观输出与参数处理
Rust终端颜色与CLI参数解析库concolor-clap的使用
concolor-clap是一个方便与clap配合使用的库,用于在命令行应用中实现美观的输出和参数处理。
安装
在项目中运行以下Cargo命令:
cargo add concolor-clap
或者在Cargo.toml中添加:
concolor-clap = "0.1.0"
许可证
双许可:MIT或Apache 2.0
完整示例代码
以下是使用concolor-clap实现美观命令行输出的完整示例:
use clap::{Parser, Subcommand};
use concolor_clap::{Color, color_if};
/// 一个带彩色输出的CLI应用
#[derive(Parser)]
#[command(name = "myapp")]
#[command(author, version, about, long_about = None)]
struct Cli {
/// 启用/禁用彩色输出
#[arg(long, value_enum, global = true)]
color: Option<Color>,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
/// 打印欢迎信息
Greet {
/// 要问候的人名
#[arg(short, long)]
name: String,
},
/// 计算数字总和
Sum {
/// 要计算的数字
#[arg(short, long, value_delimiter = ' ', num_args = 1..)]
numbers: Vec<f64>,
},
}
fn main() {
let cli = Cli::parse();
// 应用颜色设置
color_if(&cli);
match &cli.command {
Commands::Greet { name } => {
// 使用彩色输出
println!("{}Hello, {}!",
console::style("").green().bold(),
name);
}
Commands::Sum { numbers } => {
let sum: f64 = numbers.iter().sum();
// 根据结果值使用不同颜色
let color = if sum < 0.0 {
console::Style::new().red()
} else {
console::Style::new().green()
};
println!("{}Sum: {:.2}", color.apply_to(""), sum);
}
}
}
使用说明
Color
枚举允许用户通过--color
参数控制彩色输出color_if
函数会根据用户输入自动配置颜色输出- 可以使用
console
库创建带颜色的输出 - 子命令和参数解析由
clap
处理
这个示例展示了如何:
- 创建带彩色输出的CLI应用
- 处理子命令和参数
- 根据用户输入动态启用/禁用颜色
- 根据计算结果值使用不同颜色
1 回复
Rust终端颜色与CLI参数解析库concolor-clap使用指南
concolor-clap
是一个结合了终端颜色输出(concolor
)和命令行参数解析(clap
)的Rust库,可以轻松实现美观的命令行应用界面和参数处理。
主要特性
- 终端彩色输出支持
- 命令行参数解析功能
- 自动检测终端颜色支持能力
- 与
clap
库无缝集成
安装
在Cargo.toml
中添加依赖:
[dependencies]
concolor-clap = "0.5"
clap = { version = "4.0", features = ["derive"] }
完整示例demo
以下是一个结合了内容中所有示例的完整demo:
use clap::Parser;
use concolor_clap::{Color, color_choice, Theme};
// 定义命令行参数结构
#[derive(Parser)]
#[command(name = "myapp")]
#[command(about = "一个漂亮的命令行应用", long_about = None)]
struct Cli {
#[arg(long, help = "输入文件路径")]
input: String,
#[arg(short, long, default_value = "output.txt", help = "输出文件路径")]
output: String,
#[arg(long, help = "启用详细输出")]
verbose: bool,
#[arg(short, long, value_parser = clap::value_parser!(u32).range(1..100))]
count: Option<u32>,
#[arg(short, long, help = "要处理的文件列表")]
files: Vec<String>,
#[arg(long, default_value = "default", help = "处理模式")]
mode: String,
#[command(flatten)]
color: color_choice(),
}
fn main() {
let cli = Cli::parse();
// 根据用户设置或自动检测设置颜色
concolor::set(cli.color.color);
// 基本颜色输出示例
println!("{} 红色警告", Color::Red.paint("警告"));
println!("{} 绿色成功", Color::Green.paint("成功"));
println!("{} 蓝色信息", Color::Blue.paint("信息"));
// 加粗文本
println!("{} 重要消息", Color::Yellow.bold().paint("重要"));
// 带背景色的文本
println!("{} 错误", Color::White.on_red().paint("严重错误"));
// 应用信息输出
println!("{} 输入文件: {}", Color::Green.paint("[INFO]"), cli.input);
println!("{} 输出文件: {}", Color::Blue.paint("[INFO]"), cli.output);
if cli.verbose {
println!("{} 详细模式已启用", Color::Yellow.paint("[DEBUG]"));
}
if let Some(count) = cli.count {
println!("{} 处理数量: {}", Color::Cyan.paint("[CONFIG]"), count);
}
if !cli.files.is_empty() {
println!("{} 文件列表:", Color::Magenta.paint("[FILES]"));
for file in cli.files {
println!(" - {}", file);
}
}
println!("{} 处理模式: {}", Color::Cyan.paint("[CONFIG]"), cli.mode);
// 自定义主题示例
let theme = Theme {
info: Color::Cyan,
warning: Color::Yellow,
error: Color::Red,
success: Color::Green,
highlight: Color::Magenta.bold(),
};
println!("{} 自定义信息颜色", theme.info.paint("信息"));
println!("{} 自定义警告颜色", theme.warning.paint("警告"));
println!("{} 自定义成功颜色", theme.success.paint("成功"));
// 执行应用逻辑...
println!("{} 处理完成!", Color::Green.paint("[SUCCESS]"));
}
运行示例
# 自动检测颜色支持
cargo run -- --input input.txt --output result.txt --files file1.txt file2.txt --count 5 --verbose
# 强制启用颜色
cargo run -- --input input.txt --output result.txt --color always
# 禁用颜色
cargo run -- --input input.txt --output result.txt --color never
这个完整示例展示了:
- 基本的命令行参数定义
- 彩色文本输出
- 详细模式控制
- 数值范围验证
- 文件列表处理
- 自定义颜色主题
- 颜色控制参数
所有功能都集成在一个统一的CLI应用中,可以直接运行测试效果。