Skip to content
/ args Public

Simple and type-safe commandline argument parser for C++14

Notifications You must be signed in to change notification settings

pfultz2/args

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Args

Simple and typesafe commandline parsing for C++14.

Quickstart

Simply provide a class with fields that is to be filled by command-line arguments:

struct hello
{
    static const char* help()
    {
        return "Simple program that greets NAME for a total of COUNT times.";
    }
    int count;
    std::string name;

    hello() : count(1)
    {}

    template<class F>
    void parse(F f)
    {
        f(count, "--count", "-C", args::help("Number of greetings."));
        f(name, "--name", "-N", args::help("The person to greet."), args::required());
    }

    void run()
    {
        for(int i=0;i<count;i++) printf("%s\n", name.c_str());
    }
};

int main(int argc, char const *argv[]) 
{
    args::parse<hello>(argc, argv);
}

The command then could be run like this:

$ hello --name Paul --count 3
Paul
Paul
Paul

The args library will auto-generate help info:

$ hello --help
Usage: hello [options...]

  Simple program that greets NAME for a total of COUNT times.  

Options: 

            -h, --help Show help  
 --count, -C [integer] Number of greetings.  
   --name, -N [string] The person to greet.

In addition, nested commands can be created:

struct cli : args::group<cli>
{
    static const char* help()
    {
        return "Command-line interface to manage a database";
    }
};

struct initdb : cli::command<initdb>
{
    initdb() {}
    static const char* help()
    {
        return "Initialize database";
    }
    void run()
    {
        printf("Initialize database\n");
    }
};

struct dropdb : cli::command<dropdb>
{
    dropdb() {}
    static const char* help()
    {
        return "Delete database";
    }
    void run()
    {
        printf("Delete database\n");
    }
};

int main(int argc, char const *argv[]) 
{
    args::parse<cli>(argc, argv);
}

So each subcommand can be ran like this:

$ cli initdb
Initialize database
$ cli dropdb
Delete database

In addition help is generated for subcommands as well:

$ cli --help
Usage: cli [options...] [command]

  Command-line interface to manage a database  

Options: 

 -h, --help Show help  

Commands: 

     dropdb Delete database  
     initdb Initialize database