CLI framework para Rust: creación de potentes aplicaciones de consola
Rust es un lenguaje de programación de sistemas ideal para crear utilidades de consola rápidas y confiables. Gracias a su tipado estricto, abstracciones de costo cero y el gestor de paquetes integrado Cargo, Rust permite desarrollar herramientas CLI que funcionan al instante y no requieren intérprete. En este artículo, exploraremos tres CLI frameworks populares para Rust: clap, structopt y argh, y mostraremos cómo crear aplicaciones de consola profesionales con ellos.
¿Por qué Rust para CLI?
Rust se elige para el desarrollo CLI por varias razones:
- Rendimiento — el código compilado funciona al nivel de C/C++.
- Seguridad de memoria — el sistema de propiedad elimina fugas y condiciones de carrera.
- Multiplataforma — una sola base de código funciona en Windows, macOS y Linux.
- Ecosistema — miles de crates listos para cualquier tarea.
1. Clap — el estándar de la industria
clap (Command Line Argument Parser) es el framework más popular para analizar argumentos de línea de comandos en Rust. Soporta argumentos posicionales, opciones, banderas, subcomandos, generación automática de ayuda y autocompletado para Bash/Zsh/Fish.
Instalación
Agregue a Cargo.toml:
[dependencies]clap = { version = "4.5", features = ["derive"] }Ejemplo: calculadora simple
use clap::Parser;
#[derive(Parser)]#[command(name = "calc")]#[command(about = "Calculadora CLI simple")]struct Cli { /// Primer número a: f64,
/// Segundo número b: f64,
/// Operación: 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!("Error: división por cero"); std::process::exit(1); } cli.a / cli.b } _ => { eprintln!("Operación desconocida: {}", cli.operation); std::process::exit(1); } }; println!("Resultado: {}", result);}Ejecución:
cargo run -- 10 5 --operation mul# Salida: Resultado: 502. Structopt — enfoque elegante
structopt solía ser un crate independiente, pero ahora su funcionalidad está integrada en clap a través de macros derive. Sin embargo, muchos proyectos antiguos todavía lo usan directamente. Structopt permite describir argumentos como campos de una estructura con anotaciones.
Instalación (para proyectos legacy)
[dependencies]structopt = "0.3"Ejemplo: utilidad para trabajar con archivos
use structopt::StructOpt;use std::path::PathBuf;
#[derive(StructOpt)]#[structopt(name = "fileutil", about = "Utilidad para trabajar con archivos")]struct Opt { /// Archivo de entrada #[structopt(parse(from_os_str))] input: PathBuf,
/// Archivo de salida (opcional) #[structopt(parse(from_os_str), short = "o", long = "output")] output: Option<PathBuf>,
/// Modo: copy o move #[structopt(short, long, default_value = "copy")] mode: String,
/// Bandera verbose #[structopt(short, long)] verbose: bool,}
fn main() { let opt = Opt::from_args(); if opt.verbose { println!("Procesando archivo: {:?}", opt.input); } // Lógica de copia/movimiento}3. Argh — minimalismo y velocidad
argh — un framework ligero con una cantidad mínima de dependencias
También en la biblioteca
Compression en JavaScript (Node.js): guía completa con ejemplos
Trabajo con fechas en C# (.NET): revisión de bibliotecas y herramientas integradas
Generador de códigos QR en Go (Golang) con la librería go-qrcode
Biblioteca estándar de Rust: revisión completa