Goby3 3.2.3
2025.05.13
Loading...
Searching...
No Matches
configurator.h
Go to the documentation of this file.
1// Copyright 2018-2025:
2// GobySoft, LLC (2013-)
3// Community contributors (see AUTHORS file)
4// File authors:
5// Toby Schneider <toby@gobysoft.org>
6//
7//
8// This file is part of the Goby Underwater Autonomy Project Libraries
9// ("The Goby Libraries").
10//
11// The Goby Libraries are free software: you can redistribute them and/or modify
12// them under the terms of the GNU Lesser General Public License as published by
13// the Free Software Foundation, either version 2.1 of the License, or
14// (at your option) any later version.
15//
16// The Goby Libraries are distributed in the hope that they will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19// GNU Lesser General Public License for more details.
20//
21// You should have received a copy of the GNU Lesser General Public License
22// along with Goby. If not, see <http://www.gnu.org/licenses/>.
23
24#ifndef GOBY_MIDDLEWARE_APPLICATION_CONFIGURATOR_H
25#define GOBY_MIDDLEWARE_APPLICATION_CONFIGURATOR_H
26
29
30namespace goby
31{
32namespace middleware
33{
38template <typename Config> class ConfiguratorInterface
39{
40 public:
42 const Config& cfg() const { return cfg_; }
43
46 virtual const protobuf::AppConfig& app_configuration() const { return app_configuration_; }
47
51 virtual void validate() const {}
52
55 {
56 std::cerr << "Invalid configuration: " << e.what() << std::endl;
57 }
58
60 virtual std::string str() const = 0;
61
62 protected:
64 Config& mutable_cfg() { return cfg_; }
65
67 virtual protobuf::AppConfig& mutable_app_configuration() { return app_configuration_; }
68
69 private:
70 Config cfg_;
71 protobuf::AppConfig app_configuration_;
72};
73
77template <typename Config> class ProtobufConfigurator : public ConfiguratorInterface<Config>
78{
79 public:
84 ProtobufConfigurator(int argc, char* argv[]);
85
86 const protobuf::AppConfig& app_configuration() const override { return this->cfg().app(); }
87
88 protected:
89 virtual void validate() const override
90 {
91 middleware::ConfigReader::check_required_cfg(this->cfg(), this->cfg().app().binary());
92 }
93
94 private:
95 virtual std::string str() const override { return this->cfg().DebugString(); }
96
97 void handle_config_error(middleware::ConfigException& e) const override
98 {
99 if (tool_has_help_action())
100 {
101 std::cerr << "Invalid command: " << e.what() << std::endl;
102 }
103 else
104 {
105 std::cerr << "Invalid configuration: use --help and/or --example_config for more help: "
106 << e.what() << std::endl;
107 }
108 }
109
110 protobuf::AppConfig& mutable_app_configuration() override
111 {
112 return *this->mutable_cfg().mutable_app();
113 }
114
115 void merge_app_base_cfg(protobuf::AppConfig* base_cfg,
116 const boost::program_options::variables_map& var_map);
117
118 bool tool_has_help_action() const
119 {
120 return Config::descriptor()
121 ->options()
122 .GetExtension(goby::msg)
123 .cfg()
124 .tool()
125 .has_help_action();
126 }
127};
128
129template <typename Config>
131{
132 //
133 // read the configuration
134 //
135 Config& cfg = this->mutable_cfg();
136
137 boost::program_options::variables_map var_map;
138 try
139 {
140 std::string application_name;
141 std::string binary_name;
142
143 // we will check it later in validate()
144 bool check_required_cfg = false;
145 boost::program_options::options_description od{"All options"};
147 argc, argv, &cfg, &application_name, &binary_name, &od, &var_map, check_required_cfg);
148
149 // extra command line parameters for tool mode
150 for (int a = read_argc; a < argc; ++a)
151 cfg.mutable_app()->mutable_tool_cfg()->add_extra_cli_param(argv[a]);
152
153 // overwrite the app.name setting if it isn't set or if -a is set to change the application name. Otherwise, use it
154 if (!cfg.app().has_name() || application_name != binary_name)
155 cfg.mutable_app()->set_name(application_name);
156
157 cfg.mutable_app()->set_binary(binary_name);
158 // incorporate some parts of the AppBaseConfig that are middleware
159 // with gobyd (e.g. Verbosity)
160 merge_app_base_cfg(cfg.mutable_app(), var_map);
161 }
163 {
164 handle_config_error(e);
165
166 // allow default action to take place (usually "help")
167 if (!tool_has_help_action())
168 throw;
169 }
170
171 // TODO: convert to C++ struct app3 configuration format
172 this->mutable_app_configuration() = *cfg.mutable_app();
173}
174
175template <typename Config>
178 const boost::program_options::variables_map& var_map)
179{
180 if (var_map.count("ncurses"))
181 {
182 base_cfg->mutable_glog_config()->set_show_gui(true);
183 }
184
185 if (var_map.count("verbose"))
186 {
187 switch (var_map["verbose"].as<std::size_t>())
188 {
189 case 0: break;
190 case 1:
193 break;
194 case 2:
197 break;
198 case 3:
201 break;
202 default:
203 case 4:
206 break;
207 }
208 }
209
210 if (var_map.count("glog_file_verbose"))
211 {
212 switch (var_map["glog_file_verbose"].as<std::size_t>())
213 {
214 case 0: break;
215
216 case 1:
219 break;
220 case 2:
223 break;
224 case 3:
227 break;
228 default:
229 case 4:
232 break;
233 }
234 }
235
236 if (var_map.count("glog_file_dir"))
237 {
239 var_map["glog_file_dir"].as<std::string>());
240 }
241}
242
243} // namespace middleware
244} // namespace goby
245
246#endif
indicates a problem with the runtime command line or .cfg file configuration (or –help was given)
static void check_required_cfg(const google::protobuf::Message &message, const std::string &binary)
Checks that all required fields are set (either via the command line or the configuration file) in th...
static int read_cfg(int argc, char *argv[], google::protobuf::Message *message, std::string *application_name, std::string *binary_name, boost::program_options::options_description *od_all, boost::program_options::variables_map *var_map, bool check_required_configuration=true)
Read the configuration into a Protobuf message using the command line parameters.
Defines the interface to a "configurator", a class that can read command line parameters (argc,...
virtual void validate() const
Override to validate the configuration.
Config & mutable_cfg()
Derived classes can modify the configuration as needed in their constructor.
virtual protobuf::AppConfig & mutable_app_configuration()
Derived classes can modify the application configuration as needed in their constructor.
virtual void handle_config_error(middleware::ConfigException &e) const
Override to customize how ConfigException errors are handled.
virtual const protobuf::AppConfig & app_configuration() const
Subset of the configuration used to configure the Application itself.
const Config & cfg() const
The configuration object produced from the command line parameters.
virtual std::string str() const =0
Override to output the configuration object as a string.
Implementation of ConfiguratorInterface for Google Protocol buffers.
const protobuf::AppConfig & app_configuration() const override
Subset of the configuration used to configure the Application itself.
ProtobufConfigurator(int argc, char *argv[])
Constructs a ProtobufConfigurator. Typically passed as a parameter to goby::run.
virtual void validate() const override
Override to validate the configuration.
::goby::util::protobuf::GLogConfig * mutable_glog_config()
void set_file_dir(ArgT0 &&arg0, ArgT... args)
void set_verbosity(::goby::util::protobuf::GLogConfig_Verbosity value)
static constexpr Verbosity DEBUG1
static constexpr Verbosity VERBOSE
::goby::util::protobuf::GLogConfig_FileLog * mutable_file_log()
static constexpr Verbosity DEBUG2
void set_tty_verbosity(::goby::util::protobuf::GLogConfig_Verbosity value)
static constexpr Verbosity DEBUG3
The global namespace for the Goby project.
extern ::PROTOBUF_NAMESPACE_ID::internal::ExtensionIdentifier< ::PROTOBUF_NAMESPACE_ID::MessageOptions, ::PROTOBUF_NAMESPACE_ID::internal::MessageTypeTraits< ::goby::GobyMessageOptions >, 11, false > msg