#command-line #commander #arg


The complete solution for Rust command-line interfaces

6 releases

Uses old Rust 2015

0.1.5 Mar 31, 2022
0.1.4 Mar 31, 2022
0.1.2 Apr 13, 2018
0.1.1 Apr 30, 2017

#334 in Command-line interface

Download history 20/week @ 2023-08-08 68/week @ 2023-08-15 21/week @ 2023-08-22 28/week @ 2023-08-29 26/week @ 2023-09-05 22/week @ 2023-09-12 16/week @ 2023-09-19 22/week @ 2023-09-26 34/week @ 2023-10-03 54/week @ 2023-10-10 55/week @ 2023-10-17 72/week @ 2023-10-24 68/week @ 2023-10-31 49/week @ 2023-11-07 28/week @ 2023-11-14 49/week @ 2023-11-21

203 downloads per month
Used in 4 crates


444 lines

Commander by tickbh

The complete solution for Rust command-line interfaces.

Build Status

How to install it?

Add this to the Cargo.toml file of your project

commander = "0.1"

How to use it?

extern crate commander;
use commander::Commander;

How to get correct build time

the build time is the commander build time, if you publish release version, you can exec

cargo clean -p commander

first, that you will got right build time

Option parsing

Options with commander are defined with the .option(),.option_str(),.option_int(),.option_float(),.option_list() method. The example below parses args and options from std::env::args() or Vec<String>, leaving remaining args can get by func .get(), .get_str(), .get_int(), .get_float(), .get_list().

extern crate commander;
use commander::Commander;

fn main() {
    let command = Commander::new()
                .usage_desc("Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.")
                .option_list("-l, --list [value]", "list", Some(vec!["a".to_string(), "b".to_string(), "c".to_string()]))
                .option_int("--enum [value]", "enum", None)
                .option_int("-d, --debug [value]", "debug", Some(123))
                .option_str("-c, --copy [value]", "copy content", Some("source".to_string()))
                .option("-r", "enable recursive", None)
    if let Some(s) = command.get_str("c") {
        println!("arg c = {}", s);

    if let Some(s) = command.get_str("copy") {
        println!("arg copy = {}", s);

    if let Some(d) = command.get_int("d") {
        println!("arg d = {}", d);

    if let Some(e) = command.get_int("enum") {
        println!("arg enum = {}", e);

    if let Some(l) = command.get_list("list") {
        println!("arg list = {}", l);

    if let Some(r) = command.get("r") {
        println!("arg r = {}", r);

The output info if you build bin is test. follow examples show.

  1. ./test -c xxxx -d
arg c = xxxx
arg copy = xxxx
arg d = 123
//arg c and copy is the same arg, and we has d param but we not set the value, it read from default:123
  1. ./test -h #it will show help then exit the program
Usage:./test test
Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

  -v, --version               Show the bin version and build time
  -h, --help                  Show this help message and exit
  -l, --list [value]          list		 default:a, b, c
      --enum [value]          enum
  -d, --debug [value]         debug		 default:123
  -c, --copy [value]          拷贝内容		 default:aaa
  -r                          enable recursive
  1. ./test -v #it will show version and show build time then exit the program
Build Time:2017-04-29T14:11:24+08:00
  1. ./test --enum aa -r --list aa bb cc #we provide enum and list arg
arg list = ["aa", "bb", "cc"]
arg r = true
// we has the arg enum, but the enum is not a vaild int, so convert failed, and we provide arg r, so r is true


Contributions are welcome!

No runtime deps