mkaz.blog

Working with Rust

Command-line Args

An example parsing command-line arguments in Rust. Rust does not have a great standard library for parsing command-line arguments. You can use the std::env package to grab the list, reference documentation.

use std::env;
 
fn main() {
    let args: Vec<String> = env::args().collect();
    println!("{:?}", args);
}

This is useful if you have a simple program, for example just reading a single filename in and no options or other flags.

use std::env;
use std::fs;
 
fn main() {
    let mut args: Vec<String> = env::args().collect();
    // remove first argument which is self
    args.remove(0);
 
    let filename = match args.pop() {
        Some(val) => val,
        None => panic!("File not specified"),
    };
 
    let content = fs::read_to_string(filename).unwrap();
    println!("{}", content);
}

If you have a more complicated command-line script and want to allow for multiple flags, optional arguments, or similar; you probably want to use an external crate.

Using external crate: Clap

The external create I prefer to use for command-line parsing is clap. It has a nice syntax and allows for numerous features, from long and short flags, to optional or multiples values. See clap's documentation for more examples.

To use an external create add clap: "3.0.0-beta.2" under the dependency section in Cargo.toml. The next time you run cargo run|test it will install.

use clap::{Arg,App};
 
fn main() {
 
    let args = App::new("your-app-name")
	.version("0.1.0")
	.about("your-app-description")
	.author("Marcus Kazmierczak")
	.args(&[
		Arg::new("length")
			.about("Number value")
			.short('l')
			.long("length")
			.takes_value(true),
		Arg::new("verbose")
			.about("Boolean Flag")
			.short('v')
			.long("verbose"),
	]).get_matches();
 
 
    let length: u32 = args.value_of_t("length").unwrap_or(4);
 
    if args.is_present("verbose") {
        println!("Length is: {}", length);
    }
 
}

You can then run on the command-line, note the first -- is to skip passing the arguments to cargo, and pass them forward to the program it is running.

cargo run -- --length 5 --verbose