1 #ifndef STAN_SERVICES_ARGUMENTS_ARGUMENT_PARSER_HPP
2 #define STAN_SERVICES_ARGUMENTS_ARGUMENT_PARSER_HPP
32 std::vector<std::string> args;
35 for (
int i = argc - 1; i > 0; --i)
36 args.push_back(std::string(argv[i]));
39 bool valid_arg =
true;
42 std::vector<argument*> unset_args =
_arguments;
49 std::string cat_name = args.back();
57 cat_name =
"method=" + cat_name;
58 args.back() = cat_name;
66 if (val_name ==
"method")
69 std::vector<argument*>::iterator arg_it;
71 for (arg_it = unset_args.begin();
72 arg_it != unset_args.end(); ++arg_it) {
73 if ((*arg_it)->name() == cat_name) {
75 valid_arg &= (*arg_it)->parse_args(args, info, err,
_help_flag);
78 }
else if ((*arg_it)->name() == val_name) {
79 valid_arg &= (*arg_it)->parse_args(args, info, err,
_help_flag);
85 if (good_arg) unset_args.erase(arg_it);
87 if (cat_name ==
"help") {
90 }
else if (cat_name ==
"help-all") {
102 err(cat_name +
" is either mistyped or misplaced.");
104 std::vector<std::string> valid_paths;
106 for (
size_t i = 0; i <
_arguments.size(); ++i) {
107 _arguments.at(i)->find_arg(val_name,
"", valid_paths);
110 if (valid_paths.size()) {
111 err(
"Perhaps you meant one of the following "
112 "valid configurations?");
113 for (
size_t i = 0; i < valid_paths.size(); ++i)
114 err(
" " + valid_paths.at(i));
123 err(
"A method must be specified!");
130 const std::string& prefix =
"") {
131 for (
size_t i = 0; i <
_arguments.size(); ++i) {
138 for (
size_t i = 0; i <
_arguments.size(); ++i) {
144 const char* executable) {
145 std::string indent(2,
' ');
148 w(std::string(
"Usage: ") + executable
149 +
" <arg1> <subarg1_1> ... <subarg1_m>"
150 +
" ... <arg_n> <subarg_n_1> ... <subarg_n_m>");
153 w(
"Begin by selecting amongst the following inference methods"
154 " and diagnostics,");
156 std::vector<argument*>::iterator arg_it =
_arguments.begin();
159 std::stringstream ss;
161 for (std::vector<argument*>::iterator value_it
162 = method->
values().begin();
163 value_it != method->
values().end(); ++value_it) {
165 ss << std::setw(width)
166 << indent + (*value_it)->
name()
167 << indent + (*value_it)->description();
172 w(
"Or see help information with");
174 ss << std::setw(width)
176 << indent +
"Prints help";
179 ss << std::setw(width)
180 << indent +
"help-all"
181 << indent +
"Prints entire argument tree";
185 w(
"Additional configuration available by specifying");
188 for (; arg_it !=
_arguments.end(); ++arg_it) {
190 ss << std::setw(width)
191 << indent + (*arg_it)->name()
192 << indent + (*arg_it)->description();
197 w(std::string(
"See ") + executable +
" <arg1> [ help | help-all ] "
198 +
"for details on individual arguments.");
203 for (std::vector<argument*>::iterator it =
_arguments.begin();
205 if ( name == (*it)->name() )
Probability, optimization and sampling library.
void print_usage(interface_callbacks::writer::base_writer &w, const char *executable)
static void split_arg(const std::string &arg, std::string &name, std::string &value)
int parse_args(int argc, const char *argv[], interface_callbacks::writer::base_writer &info, interface_callbacks::writer::base_writer &err)
std::vector< argument * > & _arguments
void print(interface_callbacks::writer::base_writer &w, const std::string &prefix="")
std::vector< argument * > & values()
argument * arg(const std::string &name)
void print_help(interface_callbacks::writer::base_writer &w, bool recurse)
base_writer is an abstract base class defining the interface for Stan writer callbacks.
bool valid_value(const std::string &name)
argument_parser(std::vector< argument * > &valid_args)