1 #ifndef STAN__GM__ARGUMENTS__ARGUMENT__PARSER__HPP
2 #define STAN__GM__ARGUMENTS__ARGUMENT__PARSER__HPP
30 std::ostream* out = 0,
31 std::ostream* err = 0) {
38 std::vector<std::string> args;
41 for (
int i = argc - 1; i > 0; --i)
42 args.push_back(std::string(argv[i]));
45 bool valid_arg =
true;
48 std::vector<argument*> unset_args =
_arguments;
56 std::string cat_name = args.back();
64 cat_name =
"method=" + cat_name;
65 args.back() = cat_name;
74 if (val_name ==
"method")
77 std::vector<argument*>::iterator arg_it;
79 for (arg_it = unset_args.begin(); arg_it != unset_args.end(); ++arg_it) {
80 if ( (*arg_it)->name() == cat_name) {
82 valid_arg &= (*arg_it)->parse_args(args, out, err,
_help_flag);
86 else if ( (*arg_it)->name() == val_name) {
87 valid_arg &= (*arg_it)->parse_args(args, out, err,
_help_flag);
94 if (good_arg) unset_args.erase(arg_it);
96 if (cat_name ==
"help") {
99 }
else if (cat_name ==
"help-all") {
110 if (!good_arg && err) {
112 *err << cat_name <<
" is either mistyped or misplaced." << std::endl;
114 std::vector<std::string> valid_paths;
116 for (
size_t i = 0; i <
_arguments.size(); ++i) {
117 _arguments.at(i)->find_arg(val_name,
"", valid_paths);
120 if (valid_paths.size()) {
121 *err <<
"Perhaps you meant one of the following valid configurations?" << std::endl;
122 for (
size_t i = 0; i < valid_paths.size(); ++i)
123 *err <<
" " << valid_paths.at(i) << std::endl;
132 *err <<
"A method must be specified!" << std::endl;
138 void print(std::ostream* s,
const std::string prefix =
"") {
142 for (
size_t i = 0; i <
_arguments.size(); ++i) {
152 for (
size_t i = 0; i <
_arguments.size(); ++i) {
161 std::string indent(2,
' ');
165 *s <<
"Usage: " << executable <<
" <arg1> <subarg1_1> ... <subarg1_m>"
166 <<
" ... <arg_n> <subarg_n_1> ... <subarg_n_m>"
167 << std::endl << std::endl;
169 *s <<
"Begin by selecting amongst the following inference methods"
170 <<
" and diagnostics," << std::endl;
172 std::vector<argument*>::iterator arg_it =
_arguments.begin();
175 for (std::vector<argument*>::iterator value_it = method->
values().begin();
176 value_it != method->
values().end(); ++value_it) {
177 *s << std::setw(width)
178 << indent + (*value_it)->
name()
179 << indent + (*value_it)->description() << std::endl;
183 *s <<
"Or see help information with" << std::endl;
184 *s << std::setw(width)
186 << indent +
"Prints help" << std::endl;
187 *s << std::setw(width)
188 << indent +
"help-all"
189 << indent +
"Prints entire argument tree" << std::endl;
192 *s <<
"Additional configuration available by specifying" << std::endl;
195 for (; arg_it !=
_arguments.end(); ++arg_it) {
196 *s << std::setw(width)
197 << indent + (*arg_it)->name()
198 << indent + (*arg_it)->description() << std::endl;
202 *s <<
"See " << executable <<
" <arg1> [ help | help-all ] "
203 <<
"for details on individual arguments." << std::endl << std::endl;
208 for (std::vector<argument*>::iterator it =
_arguments.begin();
210 if ( name == (*it)->name() )
int parse_args(int argc, const char *argv[], std::ostream *out=0, std::ostream *err=0)
argument * arg(std::string name)
void print_usage(std::ostream *s, const char *executable)
static void split_arg(const std::string &arg, std::string &name, std::string &value)
argument_parser(std::vector< argument * > &valid_args)
std::vector< argument * > & _arguments
void print_help(std::ostream *s, bool recurse)
bool valid_value(std::string name)
std::vector< argument * > & values()
void print(std::ostream *s, const std::string prefix="")