How to

#Rust #Argumentos de Línea de Comando #Programación #CLI #Rust CLI #terminal

Cómo Usar Argumentos de Línea de Comando en Rust

Los argumentos de línea de comando son una forma poderosa de influir en el comportamiento de tus programas en tiempo de ejecución. En Rust, manejar argumentos de línea de comando es sencillo y se puede hacer utilizando el módulo std::env o la crate clap para un análisis más avanzado. Esta guía te llevará a través de ambos métodos con ejemplos.

Usando el Módulo std::env

El módulo std::env proporciona funciones para interactuar con el entorno del sistema operativo. Puedes recuperar los argumentos de línea de comando usando la función args, que devuelve un iterador.

Ejemplo Básico con std::env::args

Aquí hay un ejemplo sencillo que imprime los argumentos de línea de comando:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    
    println!("Número de argumentos: {}", args.len());
    for (i, argument) in args.iter().enumerate() {
        println!("Argumento {}: {}", i, argument);
    }
}

Para ejecutar este programa:

cargo run -- arg1 arg2 arg3

Salida:

Número de argumentos: 4
Argumento 0: target/debug/my_program
Argumento 1: arg1
Argumento 2: arg2
Argumento 3: arg3

Analizando Argumentos

A menudo, necesitarás analizar los argumentos de línea de comando a tipos específicos. Aquí hay un ejemplo de cómo analizar dos enteros y sumarlos:

use std::env;

fn main() {
    let args: Vec<String> = env::args().collect();
    
    if args.len() != 3 {
        eprintln!("Uso: {} <num1> <num2>", args[0]);
        std::process::exit(1);
    }
    
    let num1: i32 = args[1].parse().expect("Por favor, proporciona un entero válido");
    let num2: i32 = args[2].parse().expect("Por favor, proporciona un entero válido");

    println!("La suma es: {}", num1 + num2);
}

Usando la Crate clap

Para un análisis más complejo de argumentos de línea de comando, la crate clap es una opción popular. Proporciona una forma declarativa de especificar argumentos, opciones y subcomandos.

Ejemplo Básico con clap

Primero, agrega clap a tu Cargo.toml:

[dependencies]
clap = "4.0"

Aquí hay un ejemplo que usa clap para analizar un nombre y una edad opcional:

use clap::{Arg, Command};

fn main() {
    let matches = Command::new("mi_programa")
        .version("1.0")
        .author("Tu Nombre <tu.email@ejemplo.com>")
        .about("Programa de ejemplo con clap")
        .arg(Arg::new("nombre")
            .about("Establece el nombre a usar")
            .required(true)
            .index(1))
        .arg(Arg::new("edad")
            .about("Establece la edad a usar")
            .required(false)
            .index(2))
        .get_matches();

    let nombre = matches.value_of("nombre").unwrap();
    let edad = matches.value_of("edad").unwrap_or("desconocida");

    println!("Nombre: {}", nombre);
    println!("Edad: {}", edad);
}

Para ejecutar este programa:

cargo run -- Juan 30

Salida:

Nombre: Juan
Edad: 30

Si omites la edad:

cargo run -- Juan

Salida:

Nombre: Juan
Edad: desconocida

Conclusión

Manejar argumentos de línea de comando en Rust puede ser tan simple o tan complejo como tu aplicación requiera. Para necesidades básicas, el módulo std::env es suficiente. Para escenarios más avanzados, la crate clap ofrece características extensas y facilidad de uso. Al aprovechar estas herramientas, puedes crear aplicaciones de línea de comando flexibles y amigables en Rust.