A header only c++ library for parsing command line arguments and generating usage/help output, by Brett Robinson.
Parg has the following features:
- short flags/options
- long flags/options
- default values
- positional arguments
- [--] arguments
- piped stdin
- usage output
- help output
- version output
- helpful parsing error output
- clean and formatted --help output
Run:
$ npm i parg.cxxAnd then include parg.hh as follows:
#include "node_modules/parg.cxx/include/parg.hh"Let's write a program that will accept the flags for help and version info, a string option called file, and an integer option called num.
#include "parg.hh"
#include <string>
#include <iostream>
int main(int argc, char *argv[])
{
  // create the parg object
  OB::Parg pg {argc, argv};
  // set the program name and version
  pg.name("app").version("0.1.0 (00.00.0000)");
  // set a brief description of the program
  pg.description("an example of parg");
  // set the usage info
  pg.usage("[-v|-h]");
  // set the author
  pg.author("octobanana");
  // add help and version flags
  // default value for flags is false
  // flags and options can have either a long and short name, a long name, or a short name.
  // pg.set(<long,short>, <description>);
  // pg.set(<long>, <description>); where long is more than one char
  // pg.set(<short>, <description>); where short is one char
  pg.set("help,h", "print the help output");
  pg.set("version,v", "print the program version");
  // add file option
  // pg.set(<long,short>, <default_value>, <value_description>, <description>);
  pg.set("file,f", "config.cfg", "string", "the file to read from");
  // add num option
  pg.set("num,n", "8", "int", "an integer value");
  // parse the arguments
  // if status > 0, no arguments were found
  // if status = 0, parsing was successful
  // if status < 0, an error occurred while parsing
  int status {pg.parse()};
  if (status < 0)
  {
    // handle parsing error
    std::cout << pg.help() << "\n";
    std::cout << "Error: " << pg.error() << "\n";
    return 1;
  }
  // flags and options are accessed with their long name
  // or short if they don't have a long name
  if (pg.get<bool>("help"))
  {
    // handle -h and --help
    std::cout << pg.help();
    return 0;
  }
  if (pg.get<bool>("version"))
  {
    // handle -v and --version
    std::cout << pg.name() << " v" << pg.version() << "\n";
    return 0;
  }
  // check to see if the file option was found
  // if it wasn't found, the default parameter given will be returned with pg.get("file");
  if (pg.find("file"))
  {
    std::string file {pg.get("file")};
    std::cout << "file: " << file << "\n";
  }
  else
  {
    std::cout << "using default file: " << pg.get("file") << "\n";
  }
  // print out the num value
  int num {pg.get<int>("num")};
  std::cout << "num: " << num << "\n";
  return 0;
}Running it with the -h flag will ouput:
app -h
app:
  an example of parg
Usage:
  app [-v|-h]
Flags:
  -h, --help
    print the help output
  -v, --version
    print the program version
Options:
  -f, --file=<string>
    the file to read from
  -n, --num=<int>
    an integer value
Author:
  octobanana
See the examples directory.
Compile and run each example with:
mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Debug ../
make
./app