Simple and typesafe commandline parsing for C++14.
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