Framework CLI para Rust: criando aplicações de console poderosas
Rust é uma linguagem de programação de sistema que é ideal para criar utilitários de console rápidos e confiáveis. Graças à tipagem forte, abstrações de custo zero e ao gerenciador de pacotes integrado Cargo, Rust permite desenvolver ferramentas CLI que funcionam instantaneamente e não requerem um interpretador. Neste artigo, vamos explorar três frameworks CLI populares para Rust: clap, structopt e argh, e mostrar como criar aplicações de console profissionais com eles.
Por que Rust para CLI?
Rust é escolhido para desenvolvimento CLI por várias razões:
- Desempenho — código compilado funciona no nível de C/C++.
- Segurança de memória — o sistema de propriedade elimina vazamentos e condições de corrida.
- Multiplataforma — uma única base de código funciona no Windows, macOS e Linux.
- Ecossistema — milhares de crates prontos para qualquer tarefa.
1. Clap — padrão da indústria
clap (Command Line Argument Parser) é o framework mais popular para análise de argumentos de linha de comando em Rust. Ele suporta argumentos posicionais, opções, flags, subcomandos, geração automática de ajuda e autocompletar para Bash/Zsh/Fish.
Instalação
Adicione ao Cargo.toml:
[dependencies]clap = { version = "4.5", features = ["derive"] }Exemplo: calculadora simples
use clap::Parser;
#[derive(Parser)]#[command(name = "calc")]#[command(about = "Calculadora CLI simples")]struct Cli { /// Primeiro número a: f64,
/// Segundo número b: f64,
/// Operação: add, sub, mul, div #[arg(short, long, default_value = "add")] operation: String,}
fn main() { let cli = Cli::parse(); let result = match cli.operation.as_str() { "add" => cli.a + cli.b, "sub" => cli.a - cli.b, "mul" => cli.a * cli.b, "div" => { if cli.b == 0.0 { eprintln!("Erro: divisão por zero"); std::process::exit(1); } cli.a / cli.b } _ => { eprintln!("Operação desconhecida: {}", cli.operation); std::process::exit(1); } }; println!("Resultado: {}", result);}Execução:
cargo run -- 10 5 --operation mul# Saída: Resultado: 502. Structopt — abordagem elegante
structopt costumava ser um crate separado, mas agora sua funcionalidade está incorporada no clap através de macros derive. No entanto, muitos projetos antigos ainda o usam diretamente. Structopt permite descrever argumentos como campos de uma estrutura com anotações.
Instalação (para projetos legados)
[dependencies]structopt = "0.3"Exemplo: utilitário para manipulação de arquivos
use structopt::StructOpt;use std::path::PathBuf;
#[derive(StructOpt)]#[structopt(name = "fileutil", about = "Utilitário para manipulação de arquivos")]struct Opt { /// Arquivo de entrada #[structopt(parse(from_os_str))] input: PathBuf,
/// Arquivo de saída (opcional) #[structopt(parse(from_os_str), short = "o", long = "output")] output: Option<PathBuf>,
/// Modo: copy ou move #[structopt(short, long, default_value = "copy")] mode: String,
/// Flag verbose #[structopt(short, long)] verbose: bool,}
fn main() { let opt = Opt::from_args(); if opt.verbose { println!("Processando arquivo: {:?}", opt.input); } // Lógica de cópia/movimentação}3. Argh — minimalismo e velocidade
argh — um framework leve com o mínimo de dependências