25 for (
auto& it : parameters)
38 PopulateRawArgs(argc, argv);
41 ExpandAbbreviations();
43 executableName = std::string(rawArgs[0]);
46 while (i < rawArgs.size())
48 if ((rawArgs[i].length() > 2) && (rawArgs[i].substr(0, 2) ==
"--"))
51 i = ParseNextParameter(i, param);
53 parameters.insert(std::pair<std::string, Parameter*>(param->
Key(), param));
67 std::cerr <<
"Fatal error: Command-line parameter value-type mismatch at \"" << hctm.
What() <<
"\"!";
77 std::cerr <<
"Fatal error: Missing required command-line parameter \"" << hctm.
What() <<
"\"!";
87 std::size_t Hazelnupp::ParseNextParameter(
const std::size_t parIndex,
Parameter*& out_Par)
89 std::size_t i = parIndex;
90 const std::string key = rawArgs[parIndex];
91 std::vector<std::string> values;
94 for (i++; i < rawArgs.size(); i++)
96 if ((rawArgs[i].length() < 2) || (rawArgs[i].substr(0, 2) !=
"--"))
97 values.emplace_back(rawArgs[i]);
106 Value* parsedVal = ParseValue(values, pcn);
107 if (parsedVal !=
nullptr)
115 throw std::runtime_error(
"Unable to parse parameter!");
120 void Hazelnupp::PopulateRawArgs(
const int argc,
const char*
const* argv)
123 rawArgs.reserve(argc);
125 for (
int i = 0; i < argc; i++)
126 rawArgs.emplace_back(std::string(argv[i]));
131 void Hazelnupp::ExpandAbbreviations()
134 if (abbreviations.size() == 0)
137 for (std::string& arg : rawArgs)
140 auto abbr = abbreviations.find(arg);
141 if (abbr != abbreviations.end())
153 return parameters.find(key) != parameters.end();
156 Value* Hazelnupp::ParseValue(
const std::vector<std::string>& values,
const ParamConstraint* constraint)
159 const bool constrainType = (constraint !=
nullptr) && (constraint->
constrainType);
162 if (values.size() == 0)
165 if ((constrainType) &&
173 if ((constrainType) &&
180 else if (values.size() > 1)
183 if ((constrainType) &&
190 for (
const std::string& val : values)
192 Value* tmp = ParseValue({ val });
200 const std::string& val = values[0];
207 if ((constrainType) &&
214 Value* tmp = ParseValue({ val });
230 if ((constrainType) &&
246 return new IntValue((
long long int)num);
254 Value* tmp = ParseValue({ val });
266 return new IntValue((
long long int)num);
282 void Hazelnupp::ApplyConstraints()
285 for (
const auto& pc : constraints)
290 if (pc.second.defaultValue.size() > 0)
294 Value* tmp = ParseValue(pc.second.defaultValue, &pc.second);
295 parameters.insert(std::pair<std::string, Parameter*>(
307 if (pc.second.required)
318 return executableName;
327 return *parameters.find(key)->second->GetValue();
332 abbreviations.insert(std::pair<std::string, std::string>(abbrev, target));
338 return abbreviations.find(abbrev)->second;
343 return abbreviations.find(abbrev) != abbreviations.end();
348 abbreviations.clear();
357 const auto constraint = this->constraints.find(pc.key);
359 if (constraint != this->constraints.end())
360 constraint->second = pc;
364 this->constraints.insert(std::pair<std::string, ParamConstraint>(
381 this->crashOnFail = crashOnFail;
385 const ParamConstraint* Hazelnupp::GetConstraintForKey(
const std::string& key)
const
387 const auto constraint = constraints.find(key);
389 if (constraint == constraints.end())
392 return &constraint->second;