Framework CLI para Rust: guia completo para desenvolvimento de utilitários

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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: 50


2. 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

Recommendations