Capabilities2 0.3.0
Loading...
Searching...
No Matches
event_parameters.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <vector>
5#include <any>
6#include <stdexcept>
7#include <capabilities2_msgs/msg/capability.hpp>
8#include <capabilities2_msgs/msg/capability_parameter.hpp>
9
11{
12
13struct options_exception : public std::runtime_error
14{
15 using std::runtime_error::runtime_error;
16
17 options_exception(const std::string& what) : std::runtime_error(what)
18 {
19 }
20
21 virtual const char* what() const noexcept override
22 {
23 return std::runtime_error::what();
24 }
25};
26
27enum class OptionType
28{
29 BOOL,
30 DOUBLE,
31 INT,
32 STRING,
38};
39
47{
48 std::string key;
49 std::vector<std::string> value;
51
52 Parameter() = default;
53
54 Parameter(const capabilities2_msgs::msg::CapabilityParameter& msg)
55 {
56 key = msg.key;
57 value = msg.value;
58 type = static_cast<OptionType>(msg.type);
59 }
60
61 std::any get_value()
62 {
63 switch (type)
64 {
66 return value[0] == "true";
68 return std::stod(value[0]);
69 case OptionType::INT:
70 return std::stoi(value[0]);
72 return value[0];
74 std::vector<bool> vec;
75 for (const auto& v : value)
76 vec.push_back(v == "true");
77 return vec;
78 }
80 std::vector<double> vec;
81 for (const auto& v : value)
82 vec.push_back(std::stod(v));
83 return vec;
84 }
86 std::vector<int> vec;
87 for (const auto& v : value)
88 vec.push_back(std::stoi(v));
89 return vec;
90 }
92 return value;
93 }
94 }
95
96 void set_value(std::string new_key, std::any new_value, OptionType new_type)
97 {
98 key = new_key;
99 type = new_type;
100
101 switch (type)
102 {
103 case OptionType::BOOL:
104 value.clear();
105 value.push_back(std::any_cast<bool>(new_value) ? "true" : "false");
106 return;
108 value.clear();
109 value.push_back(std::to_string(std::any_cast<double>(new_value)));
110 return;
111 case OptionType::INT:
112 value.clear();
113 value.push_back(std::to_string(std::any_cast<int>(new_value)));
114 return;
116 value.clear();
117 value.push_back(std::any_cast<std::string>(new_value));
118 return;
120 const auto& vec = std::any_cast<std::vector<bool>>(new_value);
121 value.clear();
122 for (const auto& v : vec)
123 value.push_back(v ? "true" : "false");
124 return;
125 }
127 const auto& vec = std::any_cast<std::vector<double>>(new_value);
128 value.clear();
129 for (const auto& v : vec)
130 value.push_back(std::to_string(v));
131 return;
132 }
134 const auto& vec = std::any_cast<std::vector<int>>(new_value);
135 value.clear();
136 for (const auto& v : vec)
137 value.push_back(std::to_string(v));
138 return;
139 }
141 value = std::any_cast<std::vector<std::string>>(new_value);
142 return;
143
144 default:
145 throw options_exception("Unsupported OptionType");
146 }
147 }
148
149 capabilities2_msgs::msg::CapabilityParameter toMsg() const
150 {
151 capabilities2_msgs::msg::CapabilityParameter msg;
152 msg.key = key;
153 msg.value = value;
154 msg.type = static_cast<int>(type);
155 return msg;
156 }
157};
158
167{
168 std::vector<Parameter> options = {};
169
170 EventParameters() = default;
171
172 EventParameters(const capabilities2_msgs::msg::Capability& msg)
173 {
174 options.clear();
175 for (const auto& option_msg : msg.parameters)
176 {
177 auto option = Parameter(option_msg);
178 options.push_back(option);
179 }
180 }
181
182 bool is_empty() const
183 {
184 return options.empty();
185 }
186
193 bool has_value(const std::string& key) const
194 {
195 for (const auto& option : options)
196 if (option.key == key)
197 return true;
198 return false;
199 }
200
208 std::any get_value(const std::string& key, std::any default_value)
209 {
210 if (has_value(key))
211 for (auto& option : options)
212 {
213 if (option.key == key)
214 {
215 try
216 {
217 return option.get_value();
218 }
219 catch (const std::exception& e)
220 {
221 throw options_exception("Failed to convert option '" + option.key + "': " + e.what());
222 }
223 }
224 }
225 else
226 return default_value;
227 }
228
237 void set_value(const std::string& key, const std::any& value, const OptionType& type)
238 {
239 for (auto& option : options)
240 if (option.key == key)
241 {
242 try
243 {
244 option.set_value(key, value, type);
245 return;
246 }
247 catch (const std::exception& e)
248 {
249 throw options_exception("Failed to set option '" + option.key + "': " + e.what());
250 }
251 }
252
253 // Parameter not found, add new one
254 Parameter new_option;
255 new_option.set_value(key, value, type);
256 options.push_back(new_option);
257 }
258
259 capabilities2_msgs::msg::Capability toMsg() const
260 {
261 capabilities2_msgs::msg::Capability msg;
262 for (const auto& option : options)
263 msg.parameters.push_back(option.toMsg());
264 return msg;
265 }
266};
267
268} // namespace capabilities2_events
Definition event_base.hpp:14
OptionType
Definition event_parameters.hpp:28
capability options for a capability runner given by interface and provider
Definition event_parameters.hpp:167
std::any get_value(const std::string &key, std::any default_value)
Get the value of an option by key.
Definition event_parameters.hpp:208
EventParameters(const capabilities2_msgs::msg::Capability &msg)
Definition event_parameters.hpp:172
void set_value(const std::string &key, const std::any &value, const OptionType &type)
Set the value of an option by key, if the option does not exist it will be created.
Definition event_parameters.hpp:237
bool is_empty() const
Definition event_parameters.hpp:182
std::vector< Parameter > options
Definition event_parameters.hpp:168
bool has_value(const std::string &key) const
Check if an option with the given key exists.
Definition event_parameters.hpp:193
capabilities2_msgs::msg::Capability toMsg() const
Definition event_parameters.hpp:259
Key value pair for capability options.
Definition event_parameters.hpp:47
Parameter(const capabilities2_msgs::msg::CapabilityParameter &msg)
Definition event_parameters.hpp:54
std::any get_value()
Definition event_parameters.hpp:61
capabilities2_msgs::msg::CapabilityParameter toMsg() const
Definition event_parameters.hpp:149
std::string key
Definition event_parameters.hpp:48
std::vector< std::string > value
Definition event_parameters.hpp:49
OptionType type
Definition event_parameters.hpp:50
void set_value(std::string new_key, std::any new_value, OptionType new_type)
Definition event_parameters.hpp:96
Definition event_parameters.hpp:14
virtual const char * what() const noexcept override
Definition event_parameters.hpp:21
options_exception(const std::string &what)
Definition event_parameters.hpp:17