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);
        }
    }
}

使用说明

  1. Color枚举允许用户通过--color参数控制彩色输出
  2. color_if函数会根据用户输入自动配置颜色输出
  3. 可以使用console库创建带颜色的输出
  4. 子命令和参数解析由clap处理

这个示例展示了如何:

  • 创建带彩色输出的CLI应用
  • 处理子命令和参数
  • 根据用户输入动态启用/禁用颜色
  • 根据计算结果值使用不同颜色

1 回复

Rust终端颜色与CLI参数解析库concolor-clap使用指南

concolor-clap是一个结合了终端颜色输出(concolor)和命令行参数解析(clap)的Rust库,可以轻松实现美观的命令行应用界面和参数处理。

主要特性

  1. 终端彩色输出支持
  2. 命令行参数解析功能
  3. 自动检测终端颜色支持能力
  4. 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

这个完整示例展示了:

  1. 基本的命令行参数定义
  2. 彩色文本输出
  3. 详细模式控制
  4. 数值范围验证
  5. 文件列表处理
  6. 自定义颜色主题
  7. 颜色控制参数

所有功能都集成在一个统一的CLI应用中,可以直接运行测试效果。

回到顶部