¿Qué es Clap y para qué sirve?
En el mundo de la programación de sistemas, Rust se ha consolidado como un lenguaje que combina el rendimiento de C/C++ con la seguridad de la memoria. Sin embargo, al crear utilidades de consola, los desarrolladores a menudo se enfrentan a la tarea rutinaria de analizar los argumentos de la línea de comandos. La biblioteca Clap (Command Line Argument Parser) es el CLI framework más popular y funcional para Rust, que se encarga de todo el trabajo de procesamiento de banderas, opciones y subcomandos.
Clap permite:
- Generar automáticamente la ayuda (
--help) y la versión (--version); - Procesar argumentos posicionales, opciones con nombre y banderas;
- Crear subcomandos anidados (como en
gitocargo); - Validar tipos de datos y verificar la obligatoriedad de los argumentos;
- Trabajar con autocompletado para shells Bash, Zsh, Fish y PowerShell.
Gracias al potente macro derive y a la API declarativa, Clap reduce la cantidad de código entre 5 y 10 veces en comparación con el análisis manual. La biblioteca admite tanto utilidades simples como interfaces complejas con docenas de opciones.
Instalación de Clap en un proyecto Rust
Agregue la dependencia en Cargo.toml:
[dependencies]clap = { version = "4.5", features = ["derive"] }La bandera features = ["derive"] habilita el soporte de macros; esta es la forma recomendada para la mayoría de los proyectos. Para utilidades minimalistas, se puede usar solo la API builder (sin derive).
Ejemplo 1: Analizador simple con el macro derive
Creemos una utilidad que reciba un nombre de usuario y una bandera opcional de saludo:
use clap::Parser;
#[derive(Parser)]#[command(name = "greet")]#[command(about = "Saludo simple", long_about = None)]struct Cli { /// Nombre del usuario name: String,
/// Mostrar el saludo en mayúsculas #[arg(short, long)] uppercase: bool,}
fn main() { let cli = Cli::parse();
let greeting = format!("¡Hola, {}!", cli.name); if cli.uppercase { println!("{}", greeting.to_uppercase()); } else { println!("{}", greeting); }}Ejecute el programa:
$ cargo run -- Mundo¡Hola, Mundo!
$ cargo run -- Mundo --uppercase¡HOLA, MUNDO!
$ cargo run -- --help# Ayuda generada automáticamenteEjemplo 2: Opciones con tipos y valores predeterminados
Clap convierte automáticamente las cadenas en los tipos necesarios (números, enumeraciones, fechas). Agreguemos una opción para especificar el número de repeticiones:
use clap::Parser;
#[derive(Parser)]#[command(name = "repeat")]struct Cli { /// Texto a repetir text: String,
/// Número de repeticiones (por defecto 1) #[arg(short, long, default_value_t = 1)] count: u32,}
fn main() { let cli = Cli::parse(); for _ in 0..cli.count { println!("{}", cli.text); }}Ahora puede ejecutar:
$ cargo run -- "Rust" -c 3RustRustRustEjemplo 3: Subcomandos — como en Git
Creemos una mini-utilidad para gestionar tareas (lista de tareas) con los comandos add, list y done:
use clap::{Parser, Subcommand};
#[derive(Parser)]#[command(name = "todo")]#[command(about = "Gestor de tareas")]struct Cli { #[command(subcommand)] command: Commands,}
#[derive(Subcommand)]enum Commands { /// Agregar una nueva tarea Add { /// Texto de la tarea task: String, }, /// Mostrar todas las tareas List, /// Marcar tarea como completada Done { /// ID de la tarea id: u32, },}
fn main() { let cli = Cli::parse();
match &cli.comman También en la biblioteca
Aprendizaje automático en C++: descripción general de las bibliotecas clave
Caché en TypeScript: Redis y otras soluciones para Node.js
Lottie para Swift: guía completa con ejemplos
Cliente Redis para Go (Golang): go-redis y redigo — guía completa
Event Bus y el patrón Observer en Swift: implementación y ejemplos