CLI Framework para Rust: guía completa para el desarrollo de utilidades

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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


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

Recommendations