27 for (
auto& it : parameters)
40 PopulateRawArgs(argc, argv);
43 ExpandAbbreviations();
45 executableName = std::string(rawArgs[0]);
48 while (i < rawArgs.size())
50 if ((rawArgs[i].length() > 2) && (rawArgs[i].substr(0, 2) ==
"--"))
53 i = ParseNextParameter(i, param);
55 parameters.insert(std::pair<std::string, Parameter*>(param->
Key(), param));
69 std::cerr <<
"Fatal error: Command-line parameter value-type mismatch at \"" << hctm.
What() <<
"\"!";
79 std::cerr <<
"Fatal error: Missing required command-line parameter \"" << hctm.
What() <<
"\"!";
89 std::size_t Hazelnupp::ParseNextParameter(
const std::size_t parIndex,
Parameter*& out_Par)
91 std::size_t i = parIndex;
92 const std::string key = rawArgs[parIndex];
93 std::vector<std::string> values;
96 for (i++; i < rawArgs.size(); i++)
98 if ((rawArgs[i].length() < 2) || (rawArgs[i].substr(0, 2) !=
"--"))
99 values.emplace_back(rawArgs[i]);
108 Value* parsedVal = ParseValue(values, pcn);
109 if (parsedVal !=
nullptr)
117 throw std::runtime_error(
"Unable to parse parameter!");
122 void Hazelnupp::PopulateRawArgs(
const int argc,
const char*
const* argv)
125 rawArgs.reserve(argc);
127 for (
int i = 0; i < argc; i++)
128 rawArgs.emplace_back(std::string(argv[i]));
133 void Hazelnupp::ExpandAbbreviations()
136 if (abbreviations.size() == 0)
139 for (std::string& arg : rawArgs)
142 auto abbr = abbreviations.find(arg);
143 if (abbr != abbreviations.end())
155 return parameters.find(key) != parameters.end();
158 Value* Hazelnupp::ParseValue(
const std::vector<std::string>& values,
const ParamConstraint* constraint)
161 const bool constrainType = (constraint !=
nullptr) && (constraint->
constrainType);
164 if (values.size() == 0)
167 if ((constrainType) &&
175 if ((constrainType) &&
182 else if (values.size() > 1)
185 if ((constrainType) &&
192 for (
const std::string& val : values)
194 Value* tmp = ParseValue({ val });
202 const std::string& val = values[0];
209 if ((constrainType) &&
216 Value* tmp = ParseValue({ val });
232 if ((constrainType) &&
248 return new IntValue((
long long int)num);
256 Value* tmp = ParseValue({ val });
268 return new IntValue((
long long int)num);
284 void Hazelnupp::ApplyConstraints()
287 for (
const auto& pc : constraints)
292 if (pc.second.defaultValue.size() > 0)
296 Value* tmp = ParseValue(pc.second.defaultValue, &pc.second);
297 parameters.insert(std::pair<std::string, Parameter*>(
309 if (pc.second.required)
320 return executableName;
329 return *parameters.find(key)->second->GetValue();
334 abbreviations.insert(std::pair<std::string, std::string>(abbrev, target));
340 return abbreviations.find(abbrev)->second;
345 return abbreviations.find(abbrev) != abbreviations.end();
350 abbreviations.clear();
359 const auto constraint = this->constraints.find(pc.key);
361 if (constraint != this->constraints.end())
362 constraint->second = pc;
366 this->constraints.insert(std::pair<std::string, ParamConstraint>(
383 this->crashOnFail = crashOnFail;
387 const ParamConstraint* Hazelnupp::GetConstraintForKey(
const std::string& key)
const
389 const auto constraint = constraints.find(key);
391 if (constraint == constraints.end())
394 return &constraint->second;