goptions
goptions.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "goption.h"
4 #include "gswitch.h"
5 
6 // gemc
7 #include "gutsConventions.h"
8 
9 
10 // c++
11 #include <string>
12 #include <fstream>
13 #include <iostream>
14 #include <map>
15 #include <utility>
16 #include <vector>
17 
24 class GOptions {
25 public:
32  };
33 
39  explicit GOptions(std::string name) : option_verbosity_name(name) { addOptionTitle(std::move(name)); }
40 
51  GOptions(int argc, char* argv[], const GOptions& user_defined_options = GOptions());
52 
53 
55  if (yamlConf != nullptr) {
56  if (yamlConf->is_open()) { yamlConf->close(); }
57  delete yamlConf;
58  yamlConf = nullptr;
59  }
60  }
61 
67  void defineSwitch(const std::string& name, const std::string& description);
68 
74  void defineOption(const GVariable& gvar, const std::string& help);
75 
83  void defineOption(const std::string& name, const std::string& description, const std::vector<GVariable>& gvars,
84  const std::string& help);
85 
91  [[nodiscard]] int getScalarInt(const std::string& tag) const;
92 
93 
99  [[nodiscard]] double getScalarDouble(const std::string& tag) const;
100 
106  [[nodiscard]] std::string getScalarString(const std::string& tag) const;
107 
113  [[nodiscard]] bool getSwitch(const std::string& tag) const;
114 
121  [[nodiscard]] inline YAML::Node getOptionNode(const std::string& tag) const {
122  if (!doesOptionExist(tag)) {
123  std::cerr << "Option " << tag << " does not exist. Exiting." << std::endl;
124  exit(EC__NOOPTIONFOUND);
125  }
126  return getOptionIterator(tag)->value.begin()->second;
127  }
128 
135  [[nodiscard]] YAML::Node getOptionMapInNode(const std::string& option_name, const std::string& map_key) const;
136 
142  [[nodiscard]] int getVerbosityFor(const std::string& tag) const;
143 
152  [[nodiscard]] int getDebugFor(const std::string& tag) const;
153 
158  [[nodiscard]] const std::vector<GOption>& getOptions() const { return goptions; }
159 
164  [[nodiscard]] const std::map<std::string, GSwitch>& getSwitches() const { return switches; }
165 
170  inline void addGOptions(const GOptions& goptions_to_add) {
171  for (const auto& gopt : goptions_to_add.getOptions()) { goptions.push_back(gopt); }
172  for (const auto& sw : goptions_to_add.getSwitches()) { switches.insert(sw); }
173  for (auto& gvar : goptions_to_add.option_verbosity_names) { option_verbosity_names.push_back(gvar); }
174  }
175 
176  std::string option_verbosity_name{UNINITIALIZEDSTRINGQUANTITY};
177  std::vector<GVariable> option_verbosity_names;
178 
179  inline void addOptionTitle(const std::string& name) {
180  std::string option_verbosity_name_desc = name + " verbosity level or debug switch";
181  option_verbosity_names.emplace_back(name, 0, option_verbosity_name_desc);
182  }
183 
192  template <typename T>
193  T get_variable_in_option(const YAML::Node& node, const std::string& variable_name, const T& default_value);
194 
199  [[nodiscard]] std::vector<std::string> getYamlFiles() const { return yaml_files; }
200 
206  [[nodiscard]] bool doesOptionExist(const std::string& tag) const;
207 
208 private:
209  std::vector<GOption> goptions;
210  std::map<std::string, GSwitch> switches;
211  std::ofstream* yamlConf{};
212  std::string executableName;
213  std::string executableCallingDir;
214  std::vector<std::string> yaml_files;
215 
222  std::vector<std::string> findYamls(int argc, char* argv[]);
223 
228  void setOptionsValuesFromYamlFile(const std::string& yaml);
229 
235  void setOptionValuesFromCommandLineArgument(const std::string& optionName, const std::string& possibleYamlNode);
236 
242  std::vector<GOption>::iterator getOptionIterator(const std::string& name);
243 
249  [[nodiscard]] std::vector<GOption>::const_iterator getOptionIterator(const std::string& name) const;
250 
255  void printOptionOrSwitchHelp(const std::string& tag) const;
256 
260  void printHelp() const;
261 
265  void printWebHelp() const;
266 
270  void saveOptions() const;
271 
275  void print_version();
276 };
277 
279 GOptions& operator+=(GOptions& original, const GOptions& optionsToAdd);
The GOptions class manages command-line options and switches.
Definition: goptions.h:24
std::string option_verbosity_name
Definition: goptions.h:176
std::string getScalarString(const std::string &tag) const
Retrieves the value of a scalar string option.
Definition: goptions.cc:248
bool getSwitch(const std::string &tag) const
Retrieves the status of a switch.
Definition: goptions.cc:402
YAML::Node getOptionNode(const std::string &tag) const
Retrieves the YAML node for the specified option.
Definition: goptions.h:121
void addOptionTitle(const std::string &name)
Definition: goptions.h:179
GOptions(std::string name)
Constructor for verbosity and debug options.
Definition: goptions.h:39
~GOptions()
Definition: goptions.h:54
void defineSwitch(const std::string &name, const std::string &description)
Defines and adds a command–line switch.
Definition: goptions.cc:165
GOptions()
Default constructor.
Definition: goptions.h:31
void defineOption(const GVariable &gvar, const std::string &help)
Defines and adds a scalar option.
Definition: goptions.cc:181
YAML::Node getOptionMapInNode(const std::string &option_name, const std::string &map_key) const
Retrieves a map option’s value from within a YAML node.
Definition: goptions.cc:420
T get_variable_in_option(const YAML::Node &node, const std::string &variable_name, const T &default_value)
Retrieves a variable from a YAML node within an option.
Definition: goptions.cc:444
const std::vector< GOption > & getOptions() const
Returns the list of defined options.
Definition: goptions.h:158
const std::map< std::string, GSwitch > & getSwitches() const
Returns the map of defined switches.
Definition: goptions.h:164
double getScalarDouble(const std::string &tag) const
Retrieves the value of a scalar double option.
Definition: goptions.cc:232
void addGOptions(const GOptions &goptions_to_add)
Adds options from another GOptions object.
Definition: goptions.h:170
bool doesOptionExist(const std::string &tag) const
Checks if the specified option exists.
Definition: goptions.cc:301
int getScalarInt(const std::string &tag) const
Retrieves the value of a scalar integer option.
Definition: goptions.cc:216
std::vector< std::string > getYamlFiles() const
Retrieves the list of YAML file paths.
Definition: goptions.h:199
int getDebugFor(const std::string &tag) const
Retrieves the debug level for the specified tag.
Definition: goptions.cc:484
int getVerbosityFor(const std::string &tag) const
Retrieves the verbosity level for the specified tag.
Definition: goptions.cc:463
std::vector< GVariable > option_verbosity_names
Definition: goptions.h:177
#define EC__NOOPTIONFOUND
GOptions & operator+=(GOptions &original, const GOptions &optionsToAdd)
Overloaded operator to add options and switches from one GOptions object to another.
Definition: goptions.cc:596
Encapsulates a variable with a name, value, and description.
Definition: goption.h:24