O que é Clap e para que serve?
No mundo da programação de sistemas, o Rust se estabeleceu como uma linguagem que combina o desempenho de C/C++ com a segurança de memória. No entanto, ao criar utilitários de console, os desenvolvedores frequentemente enfrentam a tarefa rotineira de analisar argumentos de linha de comando. A biblioteca Clap (Command Line Argument Parser) é o framework CLI mais popular e funcional para Rust, que assume todo o trabalho de processamento de flags, opções e subcomandos.
Clap permite:
- Gerar automaticamente ajuda (
--help) e versão (--version); - Processar argumentos posicionais, opções nomeadas e flags;
- Criar subcomandos aninhados (como em
gitoucargo); - Validar tipos de dados e verificar a obrigatoriedade de argumentos;
- Trabalhar com autocompletar para shells Bash, Zsh, Fish e PowerShell.
Graças ao poderoso macro derive e à API declarativa, o Clap reduz a quantidade de código em 5 a 10 vezes em comparação com a análise manual. A biblioteca suporta tanto utilitários simples quanto interfaces complexas com dezenas de opções.
Instalação do Clap em um projeto Rust
Adicione a dependência no Cargo.toml:
[dependencies]clap = { version = "4.5", features = ["derive"] }A flag features = ["derive"] ativa o suporte a macros — esta é a forma recomendada para a maioria dos projetos. Para utilitários minimalistas, você pode usar apenas a API builder (sem derive).
Exemplo 1: Analisador simples com o macro derive
Vamos criar um utilitário que recebe um nome de usuário e uma flag opcional de saudação:
use clap::Parser;
#[derive(Parser)]#[command(name = "greet")]#[command(about = "Saudação simples", long_about = None)]struct Cli { /// Nome do usuário name: String,
/// Exibir saudação em maiúsculas #[arg(short, long)] uppercase: bool,}
fn main() { let cli = Cli::parse();
let greeting = format!("Olá, {}!", cli.name); if cli.uppercase { println!("{}", greeting.to_uppercase()); } else { println!("{}", greeting); }}Execute o programa:
$ cargo run -- MundoOlá, Mundo!
$ cargo run -- Mundo --uppercaseOLÁ, MUNDO!
$ cargo run -- --help# Ajuda gerada automaticamenteExemplo 2: Opções com tipos e valores padrão
Clap converte automaticamente strings nos tipos necessários (números, enumerações, datas). Vamos adicionar uma opção para especificar o número de repetições:
use clap::Parser;
#[derive(Parser)]#[command(name = "repeat")]struct Cli { /// Texto para repetir text: String,
/// Número de repetições (padrão 1) #[arg(short, long, default_value_t = 1)] count: u32,}
fn main() { let cli = Cli::parse(); for _ in 0..cli.count { println!("{}", cli.text); }}Agora você pode executar:
$ cargo run -- "Rust" -c 3RustRustRustExemplo 3: Subcomandos — como no Git
Vamos criar um mini-utilitário para gerenciar tarefas (lista de tarefas) com os comandos add, list e done:
use clap::{Parser, Subcommand};
#[derive(Parser)]#[command(name = "todo")]#[command(about = "Gerenciador de tarefas")]struct Cli { #[command(subcommand)] command: Commands,}
#[derive(Subcommand)]enum Commands { /// Adicionar nova tarefa Add { /// Texto da tarefa task: String, }, /// Mostrar todas as tarefas List, /// Marcar tarefa como concluída Done { /// ID da tarefa id: u32, },}
fn main() { let cli = Cli::parse();
match &cli.comman