Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
ArgsParser.h
Go to the documentation of this file.
1#ifndef ARG_PARSER_H
2#define ARG_PARSER_H
3
4#include <iostream>
5#include <string>
6#include <vector>
7#include <map>
8#include <memory>
9#include <optional>
10#include <stdexcept>
11#include <sstream>
12#include <algorithm>
13
14enum class ArgType {
15 STRING,
16 INT,
17 DOUBLE
18};
19
21protected:
23public:
24 explicit IValidator(ArgType argType) : type(argType) {}
25 virtual bool validate(const std::string& value) const = 0;
26 virtual std::string errorMessage() const = 0;
27 virtual ~IValidator() = default;
28};
29
30class RangeValidator : public IValidator {
31 double minValue, maxValue;
32
33public:
34 RangeValidator(double min, double max, ArgType argType)
35 : IValidator(argType), minValue(min), maxValue(max) {}
36
37 bool validate(const std::string& value) const override {
38 try {
39 switch (type) {
40 case ArgType::INT: {
41 int intValue = std::stoi(value);
42 return intValue >= static_cast<int>(minValue) && intValue <= static_cast<int>(maxValue);
43 }
44 case ArgType::DOUBLE: {
45 double doubleValue = std::stod(value);
46 return doubleValue >= minValue && doubleValue <= maxValue;
47 }
48 case ArgType::STRING:
49 // RangeValidator is not logical for strings
50 return false;
51 default:
52 return false;
53 }
54 } catch (...) {
55 return false;
56 }
57 }
58
59 std::string errorMessage() const override {
60 return "Value must be between " + std::to_string(minValue) + " and " + std::to_string(maxValue);
61 }
62};
63
65 std::vector<std::string> allowedValues;
66
67public:
68 AllowedValuesValidator(const std::vector<std::string>& values, ArgType argType)
69 : IValidator(argType), allowedValues(values) {}
70
71 bool validate(const std::string& value) const override {
72 switch (type) {
73 case ArgType::INT: {
74 try {
75 int intValue = std::stoi(value);
76 return std::find(allowedValues.begin(), allowedValues.end(), std::to_string(intValue)) != allowedValues.end();
77 } catch (...) {
78 return false;
79 }
80 }
81 case ArgType::DOUBLE: {
82 try {
83 double doubleValue = std::stod(value);
84 std::ostringstream oss;
85 oss << doubleValue;
86 return std::find(allowedValues.begin(), allowedValues.end(), oss.str()) != allowedValues.end();
87 } catch (...) {
88 return false;
89 }
90 }
91 case ArgType::STRING:
92 return std::find(allowedValues.begin(), allowedValues.end(), value) != allowedValues.end();
93 default:
94 return false;
95 }
96 }
97
98 std::string errorMessage() const override {
99 std::ostringstream oss;
100 oss << "Value must be one of: ";
101 for (size_t i = 0; i < allowedValues.size(); ++i) {
102 oss << allowedValues[i];
103 if (i < allowedValues.size() - 1) oss << ", ";
104 }
105 return oss.str();
106 }
107};
108
109
110class Argument {
111 std::string longName, shortName, helpText;
112 ArgType type;
113 bool isRequired;
114 bool allowsMultiple;
115 std::optional<std::string> defaultValue;
116 std::vector<std::shared_ptr<IValidator>> validators;
117 bool isPositional;
118
119public:
120 Argument(const std::string& longName, const std::string& shortName, const std::string& helpText,
121 ArgType type, bool isRequired, bool allowsMultiple,
122 std::optional<std::string> defaultValue, bool isPositional);
123
124 void addValidator(std::shared_ptr<IValidator> validator);
125 ArgType getType() const;
126 bool validate(const std::string& value) const;
127
128 std::string getLongName() const;
129 std::string getShortName() const;
130 std::string getHelpText() const;
131 bool isRequiredArg() const;
132 bool allowsMultipleValues() const;
133 bool isPositionalArg() const;
134 std::optional<std::string> getDefaultValue() const;
135};
136
138 std::string longName, shortName, helpText;
140 bool isRequired = false;
141 bool allowsMultiple = false;
142 std::optional<std::string> defaultValue = std::nullopt;
143 std::vector<std::shared_ptr<IValidator>> validators;
144 bool isPositional = false;
145
146public:
148 ArgumentBuilder& setLongName(const std::string& name);
149 ArgumentBuilder& setShortName(const std::string& name);
150 ArgumentBuilder& setHelpText(const std::string& text);
151 ArgumentBuilder& setRequired(bool required);
152 ArgumentBuilder& setDefaultValue(const std::string& value);
153 ArgumentBuilder& setAllowsMultiple(bool multiple);
154 ArgumentBuilder& addValidator(std::shared_ptr<IValidator> validator);
155 ArgumentBuilder& setPositional(bool positional);
156 Argument build();
157};
158
160 std::vector<Argument> arguments;
161 std::vector<Argument> positional_arguments;
162 std::map<std::string, std::vector<std::string>> parsedValues;
163 std::vector<std::string> positionalValues;
164
165public:
166 void addArgument(const Argument& arg);
167 void parse(int argc, char* argv[]);
168 std::string getValue(const std::string& name) const;
169 std::vector<std::string> getValues(const std::string& name) const;
170 std::vector<std::string> getPositionalValues() const;
171 bool exists(const std::string& name) const;
172
173 template<typename T>
174 T get(const std::string& name) const;
175
176 template<typename T>
177 T getOr(const std::string& name, const T& defaultValue) const;
178
179 template<typename T>
180 std::vector<T> getMany(const std::string& name) const;
181
182 template<typename T>
183 std::vector<T> getManyOr(const std::string& name, const std::vector<T>& defaultValues) const;
184
185 void displayHelp() const;
186
187private:
188 template<typename T>
189 static T convertFromString(const std::string& s);
190
191 const Argument* findArgumentByLongName(const std::string& name) const;
192};
193
194#include "ArgsParser.tpp"
195
196#endif // ARG_PARSER_H
ArgType
Definition ArgsParser.h:14
bool validate(const std::string &value) const override
Definition ArgsParser.h:71
std::string errorMessage() const override
Definition ArgsParser.h:98
AllowedValuesValidator(const std::vector< std::string > &values, ArgType argType)
Definition ArgsParser.h:68
T get(const std::string &name) const
std::vector< T > getMany(const std::string &name) const
std::vector< T > getManyOr(const std::string &name, const std::vector< T > &defaultValues) const
void parse(int argc, char *argv[])
std::vector< std::string > getValues(const std::string &name) const
std::vector< std::string > getPositionalValues() const
std::string getValue(const std::string &name) const
void addArgument(const Argument &arg)
void displayHelp() const
T getOr(const std::string &name, const T &defaultValue) const
bool exists(const std::string &name) const
ArgumentBuilder & setAllowsMultiple(bool multiple)
ArgumentBuilder & setType(ArgType argType)
ArgumentBuilder & setLongName(const std::string &name)
ArgumentBuilder & setDefaultValue(const std::string &value)
Argument build()
ArgumentBuilder & setHelpText(const std::string &text)
ArgumentBuilder & setPositional(bool positional)
ArgumentBuilder & setRequired(bool required)
ArgumentBuilder & setShortName(const std::string &name)
ArgumentBuilder & addValidator(std::shared_ptr< IValidator > validator)
bool allowsMultipleValues() const
bool isRequiredArg() const
std::string getLongName() const
bool validate(const std::string &value) const
bool isPositionalArg() const
std::optional< std::string > getDefaultValue() const
ArgType getType() const
std::string getShortName() const
void addValidator(std::shared_ptr< IValidator > validator)
std::string getHelpText() const
ArgType type
Definition ArgsParser.h:22
virtual std::string errorMessage() const =0
virtual bool validate(const std::string &value) const =0
virtual ~IValidator()=default
IValidator(ArgType argType)
Definition ArgsParser.h:24
std::string errorMessage() const override
Definition ArgsParser.h:59
bool validate(const std::string &value) const override
Definition ArgsParser.h:37
RangeValidator(double min, double max, ArgType argType)
Definition ArgsParser.h:34
double T(double x)
Wilson coefficient T(x).