emlabcpp
modern opinionated embedded C++ library
parameters.h
Go to the documentation of this file.
1 
24 #pragma once
25 
26 #include "../../protocol/handler.h"
27 #include "../../static_function.h"
28 #include "../contiguous_tree/request_adapter.h"
29 #include "../function_view.h"
30 #include "./convert.h"
31 #include "./coroutine.h"
32 #include "./protocol.h"
33 
34 namespace emlabcpp::testing
35 {
36 
38 
39 enum params_enum : uint8_t
40 {
41  PARAM_VALUE = 0x10,
42  PARAM_CHILD = 0x11,
44  PARAM_KEY = 0x13,
45  PARAM_TYPE = 0x14,
47  PARAM_ERROR = 0x16,
48 };
49 
51 {
52  static constexpr auto id = PARAM_VALUE;
54 };
55 
57 {
58  static constexpr auto id = PARAM_VALUE;
60 };
61 
63 {
64  static constexpr auto id = PARAM_VALUE_KEY;
66  std::variant< key_type, child_id > key;
67 };
68 
70 {
71  static constexpr auto id = PARAM_VALUE_KEY;
73 };
74 
76 {
77  static constexpr auto id = PARAM_CHILD;
79  std::variant< key_type, child_id > chid;
80 };
81 
83 {
84  static constexpr auto id = PARAM_CHILD;
86 };
87 
89 {
90  static constexpr auto id = PARAM_CHILD_COUNT;
92 };
93 
95 {
96  static constexpr auto id = PARAM_CHILD_COUNT;
98 };
99 
101 {
102  static constexpr auto id = PARAM_KEY;
105 };
106 
108 {
109  static constexpr auto id = PARAM_KEY;
111 };
112 
114 {
115  static constexpr auto id = PARAM_TYPE;
117 };
118 
120 {
121  static constexpr auto id = PARAM_TYPE;
123 };
124 
126 {
127  static constexpr auto id = PARAM_ERROR;
129 };
130 
138  param_error >;
139 
144 
153 
158 
164 
165 class parameters;
166 
167 template < typename Processor >
168 struct [[nodiscard]] params_awaiter : public wait_interface
169 {
170  Processor proc;
173 
174  using request_type = decltype( proc.req );
175 
177  : proc{ .reply = {}, .req = req }
178  , params( params )
179  {
180  }
181 
182  [[nodiscard]] coro_state get_state() const override
183  {
184  return state;
185  }
186 
187  void tick() override
188  {
189  }
190 
191  [[nodiscard]] bool await_ready() const
192  {
193  return false;
194  }
195 
196  template < typename PromiseType >
197  void await_suspend( std::coroutine_handle< PromiseType > );
198 
199  decltype( auto ) await_resume()
200  {
201  return proc.reply;
202  }
203 };
204 
205 template < typename T >
207 {
208  T reply;
210 
211  void log_error( parameters& params ) const;
212 
213  [[nodiscard]] bool set_value( params_server_client_variant const& var )
214  {
215  auto const* const val_ptr = std::get_if< param_value_reply >( &var );
216  if ( val_ptr == nullptr )
217  return false;
218  auto opt_res = value_type_converter< T >::from_value( val_ptr->value );
219  if ( opt_res )
220  reply = *opt_res;
221  return opt_res.has_value();
222  }
223 };
224 
225 template < typename T >
227 
229 {
232 
233  void log_error( parameters& ) const
234  {
235  }
236 
237  [[nodiscard]] bool set_value( params_server_client_variant const& var )
238  {
239  auto const* const val_ptr = std::get_if< param_value_reply >( &var );
240  if ( val_ptr == nullptr )
241  return false;
242  reply = val_ptr->value;
243  return true;
244  }
245 };
246 
248 
249 template < typename T >
251 {
252  T reply;
254 
255  void log_error( parameters& params ) const;
256 
257  [[nodiscard]] bool set_value( params_server_client_variant const& var )
258  {
259  auto const* const val_ptr = std::get_if< param_value_key_reply >( &var );
260  if ( val_ptr == nullptr )
261  return false;
262  auto opt_res = value_type_converter< T >::from_value( val_ptr->value );
263  if ( opt_res )
264  reply = *opt_res;
265  return opt_res.has_value();
266  }
267 };
268 
269 template < typename T >
271 
273 {
277 
278  void log_error( parameters const& ) const
279  {
280  }
281 
282  [[nodiscard]] bool set_value( params_server_client_variant const& var );
283 };
284 
286 extern template struct params_awaiter< param_type_processor >;
287 
289 {
292 
293  void log_error( parameters const& ) const
294  {
295  }
296 
297  [[nodiscard]] bool set_value( params_server_client_variant const& var );
298 };
299 
301 extern template struct params_awaiter< param_child_processor >;
302 
304 {
307 
308  void log_error( parameters const& ) const
309  {
310  }
311 
312  [[nodiscard]] bool set_value( params_server_client_variant const& var );
313 };
314 
316 extern template struct params_awaiter< param_child_count_processor >;
317 
319 {
322 
323  void log_error( parameters const& ) const
324  {
325  }
326 
327  [[nodiscard]] bool set_value( params_server_client_variant const& var );
328 };
329 
331 extern template struct params_awaiter< param_key_processor >;
332 
334 {
335 public:
337 
338  [[nodiscard]] protocol::channel_type get_channel() const
339  {
340  return channel_;
341  }
342 
343  outcome on_msg( std::span< std::byte const > data );
345 
347 
348  template < typename T >
350  {
351  return param_value_awaiter< T >{ param_value_request{ node }, *this };
352  }
353 
354  template < typename T >
356  {
358  param_value_key_request{ .nid = node, .key = chid }, *this };
359  }
360 
361  template < typename T >
363  {
365  param_value_key_request{ .nid = node, .key = k }, *this };
366  }
367 
369  {
370  return param_variant_awaiter{ param_value_request{ .nid = node }, *this };
371  }
372 
375 
377 
379 
381 
383 
384 private:
385  protocol::channel_type channel_;
386  params_reply_callback reply_cb_;
388 };
389 
390 template < typename T >
392 {
393  // TODO: this should not be ignored
394  std::ignore = params.send( param_error{ string_buffer( "for value of type:" ) } );
395  // std::ignore = params.send( param_error{ string_buffer( pretty_type_name< T >() ) } );
396 }
397 
398 template < typename T >
400 {
401  // TODO: this should not be ignored
402  std::ignore = params.send( param_error{ string_buffer( "for keyvalue of type:" ) } );
403  // std::ignore = params.send( param_error{ string_buffer( pretty_type_name< T >() ) }
404  // );
405 }
406 
407 template < typename Processor >
408 template < typename PromiseType >
409 void params_awaiter< Processor >::await_suspend( std::coroutine_handle< PromiseType > const h )
410 {
411  h.promise().iface = this;
412  params.exchange( proc.req, [this]( params_server_client_variant const& var ) {
413  if ( !proc.set_value( var ) ) {
414  // TODO: this should not be ignored
415  std::ignore = params.send(
416  param_error{ string_buffer( "failed to proces param awaiter" ) } );
417  proc.log_error( params );
418  state = coro_state::ERRORED;
419  } else {
420  state = coro_state::DONE;
421  }
422  } );
423 }
424 
426 {
427 public:
429  protocol::channel_type const chann,
430  data_tree tree,
432 
433  [[nodiscard]] protocol::channel_type get_channel() const
434  {
435  return channel_;
436  }
437 
438  outcome on_msg( std::span< std::byte const > const data );
440 
441 private:
442  outcome on_req( param_error const& req ) const;
443  outcome on_req( param_value_request const& req );
444  outcome on_req( param_value_key_request const& req );
445  outcome on_req( param_child_request const& req );
446  outcome on_req( param_child_count_request const& req );
447  outcome on_req( param_key_request const& req );
448  outcome on_req( param_type_request const& req );
449  outcome reply_node_error( contiguous_request_adapter_errors const err, node_id const nid );
450  result send( params_server_client_variant const& var );
451 
452  protocol::channel_type channel_;
453  data_tree tree_;
455 };
456 } // namespace emlabcpp::testing
Protocol library has custom type that represents message, however this is just simple overaly over st...
Definition: message.h:40
Definition: parameters.h:426
parameters_server(protocol::channel_type const chann, data_tree tree, params_server_transmit_callback send_cb)
outcome on_msg(std::span< std::byte const > const data)
outcome on_msg(params_client_server_variant const &req)
protocol::channel_type get_channel() const
Definition: parameters.h:433
Definition: parameters.h:334
void exchange(params_client_server_variant const &req, params_reply_callback reply_cb)
param_child_awaiter get_child(node_id nid, key_type const &key)
protocol::channel_type get_channel() const
Definition: parameters.h:338
outcome on_msg(params_server_client_variant const &req)
outcome on_msg(std::span< std::byte const > data)
param_type_awaiter get_type(node_id nid)
param_key_awaiter get_key(node_id nid, child_id chid)
param_child_awaiter get_child(node_id nid, child_id chid)
param_variant_awaiter get_value_variant(node_id const node)
Definition: parameters.h:368
result send(params_client_server_variant const &val)
param_value_awaiter< T > get_value(node_id const node)
Definition: parameters.h:349
parameters(protocol::channel_type chann, params_client_transmit_callback send_cb)
param_value_key_awaiter< T > get_value(node_id const node, key_type const &k)
Definition: parameters.h:362
param_child_count_awaiter get_child_count(node_id const nid)
param_value_key_awaiter< T > get_value(node_id const node, child_id const chid)
Definition: parameters.h:355
uint16_t channel_type
Definition: multiplexer.h:35
decltype(traits_for_impl< D >()) traits_for
Definition: traits.h:59
Definition: base.h:95
MIT License.
Definition: base.h:37
uint32_t node_id
Definition: base.h:42
typename protocol::traits_for< params_server_client_group >::value_type params_server_client_variant
Definition: parameters.h:155
coro_state
Definition: coroutine.h:36
typename protocol::traits_for< params_client_server_group >::value_type params_client_server_variant
Definition: parameters.h:141
string_buffer< 128 > string_buffer
Definition: base.h:46
typename protocol::handler< params_server_client_group >::message_type params_server_client_message
Definition: parameters.h:157
std::variant< int64_t, float, bool, string_buffer > value_type
Definition: base.h:51
typename protocol::handler< params_client_server_group >::message_type params_client_server_message
Definition: parameters.h:143
uint32_t child_count
Definition: base.h:43
params_enum
Definition: parameters.h:40
@ PARAM_TYPE
Definition: parameters.h:45
@ PARAM_KEY
Definition: parameters.h:44
@ PARAM_VALUE
Definition: parameters.h:41
@ PARAM_CHILD
Definition: parameters.h:42
@ PARAM_CHILD_COUNT
Definition: parameters.h:43
@ PARAM_VALUE_KEY
Definition: parameters.h:46
@ PARAM_ERROR
Definition: parameters.h:47
static constexpr protocol::channel_type params_channel
Definition: parameters.h:37
uint32_t child_id
Definition: base.h:44
constexpr pointer data() noexcept
Returns pointer to first item of the storage.
Definition: static_storage.h:108
contiguous_request_adapter_errors
Definition: base.h:46
contiguous_tree_type
Definition: base.h:33
Definition: static_function.h:109
outcome represents tristate resut of some operation, which can succeed, fail or produce an error.
Definition: outcome.h:49
result represents an result of some operation, as an alternative to returning just bool with true/fal...
Definition: result.h:42
param_child_count_request req
Definition: parameters.h:306
bool set_value(params_server_client_variant const &var)
child_count reply
Definition: parameters.h:305
void log_error(parameters const &) const
Definition: parameters.h:308
child_count count
Definition: parameters.h:97
node_id parent
Definition: parameters.h:91
Definition: parameters.h:289
node_id reply
Definition: parameters.h:290
bool set_value(params_server_client_variant const &var)
void log_error(parameters const &) const
Definition: parameters.h:293
param_child_request req
Definition: parameters.h:291
Definition: parameters.h:83
node_id chid
Definition: parameters.h:85
Definition: parameters.h:76
std::variant< key_type, child_id > chid
Definition: parameters.h:79
node_id parent
Definition: parameters.h:78
Definition: parameters.h:126
string_buffer error
Definition: parameters.h:128
Definition: parameters.h:319
param_key_request req
Definition: parameters.h:321
void log_error(parameters const &) const
Definition: parameters.h:323
bool set_value(params_server_client_variant const &var)
key_type reply
Definition: parameters.h:320
Definition: parameters.h:108
key_type key
Definition: parameters.h:110
Definition: parameters.h:101
child_id chid
Definition: parameters.h:104
node_id nid
Definition: parameters.h:103
Definition: parameters.h:273
bool set_value(params_server_client_variant const &var)
void log_error(parameters const &) const
Definition: parameters.h:278
node_type_enum reply
Definition: parameters.h:274
param_type_request req
Definition: parameters.h:275
Definition: parameters.h:120
node_type_enum type
Definition: parameters.h:122
Definition: parameters.h:114
node_id nid
Definition: parameters.h:116
T reply
Definition: parameters.h:252
param_value_key_request req
Definition: parameters.h:253
bool set_value(params_server_client_variant const &var)
Definition: parameters.h:257
Definition: parameters.h:70
value_type value
Definition: parameters.h:72
node_id nid
Definition: parameters.h:65
std::variant< key_type, child_id > key
Definition: parameters.h:66
Definition: parameters.h:207
bool set_value(params_server_client_variant const &var)
Definition: parameters.h:213
param_value_request req
Definition: parameters.h:209
T reply
Definition: parameters.h:208
Definition: parameters.h:57
value_type value
Definition: parameters.h:59
Definition: parameters.h:51
node_id nid
Definition: parameters.h:53
Definition: parameters.h:229
void log_error(parameters &) const
Definition: parameters.h:233
param_value_request req
Definition: parameters.h:231
value_type reply
Definition: parameters.h:230
bool set_value(params_server_client_variant const &var)
Definition: parameters.h:237
Definition: parameters.h:169
params_awaiter(request_type req, parameters &params)
Definition: parameters.h:176
Processor proc
Definition: parameters.h:170
parameters & params
Definition: parameters.h:172
coro_state get_state() const override
Definition: parameters.h:182
decltype(proc.req) request_type
Definition: parameters.h:174
bool await_ready() const
Definition: parameters.h:191
void tick() override
Definition: parameters.h:187
Definition: protocol.h:100
Definition: coroutine.h:45