28 for (
auto& it : parameters)
41 PopulateRawArgs(argc, argv);
44 ExpandAbbreviations();
46 executableName = std::string(rawArgs[0]);
49 while (i < rawArgs.size())
51 if ((rawArgs[i].length() > 2) && (rawArgs[i].substr(0, 2) ==
"--"))
54 i = ParseNextParameter(i, param);
56 parameters.insert(std::pair<std::string, Parameter*>(param->
Key(), param));
65 if ((!catchHelp) || (!
HasParam(
"--help")))
73 std::cerr <<
"Parameter error: " << exc.
What() << std::endl;
84 std::cerr <<
"Parameter error: " << exc.
What() << std::endl;
92 if ((catchHelp) && (
HasParam(
"--help")))
101 std::size_t Hazelnupp::ParseNextParameter(
const std::size_t parIndex,
Parameter*& out_Par)
103 std::size_t i = parIndex;
104 const std::string key = rawArgs[parIndex];
105 std::vector<std::string> values;
108 for (i++; i < rawArgs.size(); i++)
110 if ((rawArgs[i].length() < 2) || (rawArgs[i].substr(0, 2) !=
"--"))
111 values.emplace_back(rawArgs[i]);
120 Value* parsedVal = ParseValue(values, pcn);
121 if (parsedVal !=
nullptr)
129 throw std::runtime_error(
"Unable to parse parameter!");
134 void Hazelnupp::PopulateRawArgs(
const int argc,
const char*
const* argv)
137 rawArgs.reserve(argc);
139 for (
int i = 0; i < argc; i++)
140 rawArgs.emplace_back(std::string(argv[i]));
145 void Hazelnupp::ExpandAbbreviations()
148 if (parameterAbreviations.size() == 0)
151 for (std::string& arg : rawArgs)
154 auto abbr = parameterAbreviations.find(arg);
155 if (abbr != parameterAbreviations.end())
167 return parameters.find(key) != parameters.end();
170 Value* Hazelnupp::ParseValue(
const std::vector<std::string>& values,
const ParamConstraint* constraint)
176 const bool constrainType = (constraint !=
nullptr) && (constraint->
constrainType);
179 if (values.size() == 0)
184 if ((constrainType) &&
189 else if ((constrainType) &&
194 else if ((constrainType) &&
209 else if ((constrainType) &&
216 else if (values.size() > 1)
221 if ((constrainType) &&
233 for (
const std::string& val : values)
235 Value* tmp = ParseValue({ val });
243 const std::string& val = values[0];
252 if ((constrainType) &&
259 Value* tmp = ParseValue({ val });
280 if ((constrainType) &&
298 return new IntValue((
long long int)num);
306 Value* tmp = ParseValue({ val });
318 return new IntValue((
long long int)num);
336 this->catchHelp = catchHelp;
347 briefDescription = description;
353 return briefDescription;
358 parameterDescriptions[parameter] = description;
365 if (!HasDescription(parameter))
370 return parameterDescriptions.find(parameter)->second;
375 return parameterDescriptions.find(parameter) != parameterDescriptions.end();
381 parameterDescriptions.erase(parameter);
387 parameterDescriptions.clear();
393 std::stringstream ss;
396 if (briefDescription.length() > 0)
397 ss << briefDescription << std::endl;
402 std::string abbreviation;
403 std::string description;
405 bool required =
false;
406 bool typeIsForced =
false;
407 std::string defaultVal;
409 std::unordered_map<std::string, ParamDocEntry> paramInfos;
412 for (
const auto& it : parameterDescriptions)
415 if (paramInfos.find(it.first) == paramInfos.end())
417 paramInfos[it.first] = ParamDocEntry();
419 paramInfos[it.first].description = it.second;
424 for (
const auto& it : parameterAbreviations)
427 if (paramInfos.find(it.second) == paramInfos.end())
429 paramInfos[it.second] = ParamDocEntry();
431 paramInfos[it.second].abbreviation = it.first;
435 for (
const auto& it : parameterConstraints)
438 if (paramInfos.find(it.first) == paramInfos.end())
440 paramInfos[it.first] = ParamDocEntry();
442 ParamDocEntry& cached = paramInfos[it.first];
443 cached.required = it.second.required;
444 cached.typeIsForced = it.second.constrainType;
447 std::stringstream defaultValueSs;
448 for (
const std::string& s : it.second.defaultValue)
450 defaultValueSs <<
'\'' << s <<
'\'';
453 if ((
void*)&s != (
void*)&it.second.defaultValue.back())
454 defaultValueSs <<
" ";
456 cached.defaultVal = defaultValueSs.str();
460 if (paramInfos.size() > 0)
463 <<
"==== AVAILABLE PARAMETERS ===="
464 << std::endl << std::endl;
466 std::size_t counter = 0;
467 for (
const auto& it : paramInfos)
469 const ParamDocEntry& pde = it.second;
472 ss << it.first <<
" ";
475 if (pde.abbreviation.length() > 0)
476 ss << pde.abbreviation <<
" ";
479 if (pde.typeIsForced)
480 ss << pde.type <<
" ";
483 if (pde.defaultVal.length() > 0)
484 ss <<
"default=[" << pde.defaultVal <<
"] ";
487 if ((pde.required) && (pde.defaultVal.length() == 0))
488 ss <<
"[[REQUIRED]] ";
491 if (pde.description.length() > 0)
492 ss << pde.description;
495 if (counter < paramInfos.size()-1)
496 ss << std::endl << std::endl;
505 void Hazelnupp::ApplyConstraints()
508 for (
const auto& pc : parameterConstraints)
513 if (pc.second.defaultValue.size() > 0)
517 Value* tmp = ParseValue(pc.second.defaultValue, &pc.second);
518 parameters.insert(std::pair<std::string, Parameter*>(
530 if (pc.second.required)
544 return parameterConstraints.find(parameter)->second;
549 parameterConstraints.erase(parameter);
555 return executableName;
564 return *parameters.find(key)->second->GetValue();
569 parameterAbreviations.insert(std::pair<std::string, std::string>(abbrev, target));
578 return parameterAbreviations.find(abbrev)->second;
583 return parameterAbreviations.find(abbrev) != parameterAbreviations.end();
588 parameterAbreviations.erase(abbrevation);
594 parameterAbreviations.clear();
601 (parameterConstraints[key] = constraint).key = key;
607 parameterConstraints.clear();
613 this->crashOnFail = crashOnFail;
617 const ParamConstraint* Hazelnupp::GetConstraintForKey(
const std::string& key)
const
619 const auto constraint = parameterConstraints.find(key);
621 if (constraint == parameterConstraints.end())
624 return &constraint->second;