/*! @file

    @id $Id$
*/
//       1         2         3         4         5         6         7         8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890

#include <mrw/args.hxx>
#ifdef MRW__OLD_PRE11_COMPILER
#include <mrw/vector.hxx>
#endif

void test_func() {
  std::cout<<"test parameter was given on command line"<<std::endl;
}

int main(int argc, char** argv) try {

  // option variables
  bool flag(false);
  int r(5);
  std::string txt("Hello World");
  int x(0), y(0);

  std::string description("This is an example for argument processing. If the "
                          "description is very long, it is automatically "
                          "splitted over several lines and indented on each "
                          "new line. Arguments may have several parameters. "
                          "Help is generated automatically from the argument "
                          "declaration. The argument declaration contains long "
                          "and short options and a list of parameters.");
  std::string returns("Returns a status of 0 on success and 1 on any error.");

  // bind and evaluate options
#ifdef MRW__OLD_PRE11_COMPILER
  mrw::args::parse(argc, argv, description, mrw::args::defaults()
                   <<mrw::args::decl("h", "help", "show this help",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::help()
                                     <<mrw::args::exit())
                   <<mrw::args::decl("r", "repeat", "number of repetitions",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::param(r, "number"))
                   <<mrw::args::decl("f", "flag", "check a flag",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::param(flag))
                   <<mrw::args::decl("t", "text", "pass a text",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::param(txt, "text"))
                   <<mrw::args::decl("c", "coord", "add some 2D coordinates",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::param(x, "x")
                                     <<mrw::args::param(y, "y"))
                   <<mrw::args::decl("",  "test", "call test_func, no shortcut",
                                     mrw::args::decl::param_list()
                                     <<mrw::args::func(test_func)),
                   returns);
#else
  mrw::args::parse(argc, argv,
                   description,
                   {
                     {"h", "help", "show this help",
                         {mrw::args::help(), mrw::args::exit()}},
                     {"r", "repeat", "number of repetitions",
                         {mrw::args::param(r, "number")}},
                     {"f", "flag",
                         "check a flag; this is a boolean, so it is false by "
                         "default and true if the user specifies the flag on "
                         "the command line", {mrw::args::param(flag)}},
                     {"t", "text", "pass a text",
                         {mrw::args::param(txt, "text")}},
                     {"c", "coord",
                         "add some 2D coordinates; this is an example on how "
                         "you can add more than one parameter",
                           {mrw::args::param(x, "x"),
                            mrw::args::param(y, "y")}},
                     {"",  "test", "call test_func, no shortcut",
                         {mrw::args::func(test_func)}},
                   },
                   returns);
#endif
  
  // show the result
  std::cout<<std::endl
           <<"commandline is parsed, these are the settings now:"<<std::endl
           <<"r           = "<<r<<std::endl
           <<"flag        = "<<(flag?"yes":"no")<<std::endl
           <<"txt         = "<<txt<<std::endl
           <<"coordinates = "<<x<<", "<<y<<std::endl;
  
  return 0;
 } catch (const std::exception& x) {
  std::cerr<<"**** ERROR: "<<x.what()<<std::endl;
  return 1;
 }
