ifw-daq  1.0.0
IFW Data Acquisition modules
requestor.hpp
Go to the documentation of this file.
1 /**
2  * @file
3  * @ingroup daq_ocm_serverctl
4  * @copyright ESO - European Southern Observatory
5  *
6  * @brief
7  */
8 #ifndef OCF_OCM_SERVERCTL_REQUESTOR_HPP_
9 #define OCF_OCM_SERVERCTL_REQUESTOR_HPP_
10 
11 #include <iostream>
12 #include <type_traits>
13 #include <unordered_map>
14 #include <vector>
15 
16 #include <boost/asio/io_service.hpp>
17 #include <boost/program_options.hpp>
18 
19 #include <Stdif.hpp>
20 #include <Ocmif.hpp>
21 #include <rad/logger.hpp>
22 
23 std::ostream& operator<<(std::ostream& os, std::shared_ptr<ocmif::DaqStatus> const& s);
24 std::ostream& operator<<(std::ostream& os, std::shared_ptr<ocmif::DaqReply> const& s);
25 std::ostream& operator<<(std::ostream& os, std::vector<std::shared_ptr<ocmif::DaqStatus>> const& s);
26 std::ostream& operator<<(std::ostream& os, std::vector<std::shared_ptr<ocmif::AwaitDaqReply>> const& s);
27 
28 template <class T>
29 struct JsonPrint {
30  JsonPrint(T const& t_arg) : t(t_arg) {}
31  T const& t;
32 };
33 
34 std::ostream& operator<<(std::ostream& os, JsonPrint<std::shared_ptr<ocmif::DaqStatus>> const& s);
35 std::ostream& operator<<(std::ostream& os, JsonPrint<std::shared_ptr<ocmif::DaqReply>> const& s);
36 std::ostream& operator<<(std::ostream& os, JsonPrint<std::shared_ptr<ocmif::AwaitDaqReply>> const& s);
37 std::ostream& operator<<(std::ostream& os, JsonPrint<std::string> const& s);
38 std::ostream& operator<<(std::ostream& os, JsonPrint<std::vector<std::shared_ptr<ocmif::DaqStatus>>> const& s);
39 
40 struct CommonArgs {
41  bool json;
42  unsigned timeout;
43  std::string req_addr;
44  std::string pub_addr;
45  elt::mal::Mal* mal;
46 
47  CommonArgs() = default;
48  CommonArgs(CommonArgs const&) = delete;
49  CommonArgs& operator=(CommonArgs const&) = delete;
50 };
51 
52 struct Requestor {
53  explicit Requestor(CommonArgs& args);
54  virtual ~Requestor() {
55  }
56  virtual std::string Synopsis();
57  /**
58  * Add arguments to command.
59  */
60  virtual void AddOptions(boost::program_options::options_description& descr);
61  /**
62  * Receives a parsed variables_map that include the options added with AddOptions.
63  */
64  virtual void Handle(::stdif::StdCmdsSync& std_cmds,
65  ::ocmif::OcmDaqSync& daq_cmds,
66  boost::program_options::variables_map& vm,
67  std::vector<std::string>& opts) = 0;
68 
69 protected:
71 };
72 
75  virtual std::string Synopsis() override;
76  virtual void Handle(::stdif::StdCmdsSync& std_cmds,
77  ::ocmif::OcmDaqSync& daq_cmds,
78  boost::program_options::variables_map& vm,
79  std::vector<std::string>& opts) override;
80 };
81 
82 /**
83  * Simple requestor for commands without argument
84  *
85  * @tparam Func is either a StdCmdsSync or OcmDaqSync member function pointer, taking no arguments
86  * and returning a type that has an ostream << operator:
87  * E.g.: `using Func = decltype(&ocmif::StdCmds::Enable)`;
88  */
89 template <class Func>
91  SimpleRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
92  }
93  void Handle(::stdif::StdCmdsSync& std_cmds,
94  ::ocmif::OcmDaqSync& daq_cmds,
95  boost::program_options::variables_map& vm,
96  std::vector<std::string>& opts) override {
97  if constexpr (std::is_invocable_v<Func, decltype(std_cmds)>) {
98  auto reply = (std_cmds.*m_func)();
99  if (m_args.json) {
100  std::cout << JsonPrint(reply);
101  } else {
102  std::cout << "Reply: " << reply << std::endl;
103  }
104  } else if constexpr (std::is_invocable_v<Func, decltype(daq_cmds)>) {
105  auto reply = (daq_cmds.*m_func)();
106  if (m_args.json) {
107  std::cout << JsonPrint(reply);
108  } else {
109  std::cout << "Reply: " << reply << std::endl;
110  }
111  } else {
112  }
113  }
114 
115  Func m_func;
116 };
117 
118 /**
119  * Simple Daq commands that accepts a single argument `id` and returns a shared_ptr type
120  * that can be formatted with ostream<< operator when dereferenced.
121  */
122 template <class Func>
124  SimpleDaqRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
125  }
126 
127  std::string Synopsis() override {
128  return "<id>";
129  }
130 
131  void Handle(::stdif::StdCmdsSync& std_cmds,
132  ::ocmif::OcmDaqSync& daq_cmds,
133  boost::program_options::variables_map& vm,
134  std::vector<std::string>& opts) override {
135  if (opts.size() != 2) {
136  throw std::invalid_argument("command requires the `id` argument");
137  }
138  auto reply = (daq_cmds.*m_func)(opts[1]);
139  if (m_args.json) {
140  std::cout << JsonPrint(reply);
141  } else {
142  std::cout << "Reply: " << reply << std::endl;
143  }
144  }
145 
146  Func m_func;
147 };
148 
149 
150 template <class Func>
152  NoArgRequestor(Func func, CommonArgs& args) : Requestor(args), m_func(func) {
153  }
154 
155  void Handle(::stdif::StdCmdsSync& std_cmds,
156  ::ocmif::OcmDaqSync& daq_cmds,
157  boost::program_options::variables_map& vm,
158  std::vector<std::string>& opts) override {
159  auto reply = (daq_cmds.*m_func)();
160  if (m_args.json) {
161  std::cout << JsonPrint(reply);
162  } else {
163  std::cout << "Reply: " << reply << std::endl;
164  }
165  }
166 
167  Func m_func;
168 };
169 
171  std::string m_id;
172  std::string m_prefix;
173  std::string m_primary_sources;
174  std::string m_metadata_sources;
175  std::string m_properties;
176 
177  using Requestor::Requestor;
178 
179  std::string Synopsis() override;
180  void AddOptions(boost::program_options::options_description& descr) override;
181  void Handle(::stdif::StdCmdsSync& std_cmds,
182  ::ocmif::OcmDaqSync& daq_cmds,
183  boost::program_options::variables_map& vm,
184  std::vector<std::string>& opts) override;
185 };
186 
188  using Requestor::Requestor;
189 
190  std::string Synopsis() override;
191  void AddOptions(boost::program_options::options_description& descr) override;
192  void Handle(::stdif::StdCmdsSync& std_cmds,
193  ::ocmif::OcmDaqSync& daq_cmds,
194  boost::program_options::variables_map& vm,
195  std::vector<std::string>& opts) override;
196 };
197 
199  using Requestor::Requestor;
200 
201  std::string Synopsis() override;
202  void AddOptions(boost::program_options::options_description& descr) override;
203  void Handle(::stdif::StdCmdsSync& std_cmds,
204  ::ocmif::OcmDaqSync& daq_cmds,
205  boost::program_options::variables_map& vm,
206  std::vector<std::string>& opts) override;
207 };
208 
209 #endif // #ifndef OCF_OCM_SERVERCTL_REQUESTOR_HPP_
AwaitStateRequestor::Synopsis
std::string Synopsis() override
Definition: requestor.cpp:210
UpdateKeywordsRequestor::Synopsis
std::string Synopsis() override
Definition: requestor.cpp:184
CommonArgs
Definition: requestor.hpp:40
AwaitStateRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:214
NoArgRequestor::m_func
Func m_func
Definition: requestor.hpp:167
Requestor::Requestor
Requestor(CommonArgs &args)
Definition: requestor.cpp:117
SetLogLevelRequestor::Synopsis
virtual std::string Synopsis() override
Definition: requestor.cpp:126
JsonPrint
Definition: requestor.hpp:29
SimpleDaqRequestor::SimpleDaqRequestor
SimpleDaqRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:124
StartDaqRequestor::AddOptions
void AddOptions(boost::program_options::options_description &descr) override
Add arguments to command.
Definition: requestor.cpp:150
CommonArgs::req_addr
std::string req_addr
Definition: requestor.hpp:43
SimpleRequestor
Simple requestor for commands without argument.
Definition: requestor.hpp:90
Requestor::Synopsis
virtual std::string Synopsis()
Definition: requestor.cpp:120
CommonArgs::json
bool json
Definition: requestor.hpp:41
StartDaqRequestor::Synopsis
std::string Synopsis() override
Definition: requestor.cpp:158
StartDaqRequestor
Definition: requestor.hpp:170
NoArgRequestor
Definition: requestor.hpp:151
StartDaqRequestor::m_primary_sources
std::string m_primary_sources
Definition: requestor.hpp:173
CommonArgs::CommonArgs
CommonArgs(CommonArgs const &)=delete
JsonPrint::t
T const & t
Definition: requestor.hpp:31
SimpleDaqRequestor
Simple Daq commands that accepts a single argument id and returns a shared_ptr type that can be forma...
Definition: requestor.hpp:123
CommonArgs::mal
elt::mal::Mal * mal
Definition: requestor.hpp:45
CommonArgs::timeout
unsigned timeout
Definition: requestor.hpp:42
JsonPrint::JsonPrint
JsonPrint(T const &t_arg)
Definition: requestor.hpp:30
SimpleDaqRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:131
StartDaqRequestor::m_properties
std::string m_properties
Definition: requestor.hpp:175
CommonArgs::operator=
CommonArgs & operator=(CommonArgs const &)=delete
StartDaqRequestor::m_id
std::string m_id
Definition: requestor.hpp:171
SimpleRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:93
CommonArgs::CommonArgs
CommonArgs()=default
SetLogLevelRequestor
Definition: requestor.hpp:73
StartDaqRequestor::m_prefix
std::string m_prefix
Definition: requestor.hpp:172
Requestor::~Requestor
virtual ~Requestor()
Definition: requestor.hpp:54
SimpleRequestor::m_func
Func m_func
Definition: requestor.hpp:115
CommonArgs::pub_addr
std::string pub_addr
Definition: requestor.hpp:44
AwaitStateRequestor::AddOptions
void AddOptions(boost::program_options::options_description &descr) override
Add arguments to command.
Definition: requestor.cpp:206
SimpleDaqRequestor::m_func
Func m_func
Definition: requestor.hpp:146
Requestor::m_args
CommonArgs & m_args
Definition: requestor.hpp:70
AwaitStateRequestor
Definition: requestor.hpp:198
SimpleRequestor::SimpleRequestor
SimpleRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:91
NoArgRequestor::NoArgRequestor
NoArgRequestor(Func func, CommonArgs &args)
Definition: requestor.hpp:152
Requestor::AddOptions
virtual void AddOptions(boost::program_options::options_description &descr)
Add arguments to command.
Definition: requestor.cpp:124
operator<<
std::ostream & operator<<(std::ostream &os, std::shared_ptr< ocmif::DaqStatus > const &s)
Definition: requestor.cpp:17
StartDaqRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:162
UpdateKeywordsRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:188
StartDaqRequestor::m_metadata_sources
std::string m_metadata_sources
Definition: requestor.hpp:174
SetLogLevelRequestor::Handle
virtual void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.cpp:130
Requestor::Handle
virtual void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts)=0
Receives a parsed variables_map that include the options added with AddOptions.
NoArgRequestor::Handle
void Handle(::stdif::StdCmdsSync &std_cmds, ::ocmif::OcmDaqSync &daq_cmds, boost::program_options::variables_map &vm, std::vector< std::string > &opts) override
Receives a parsed variables_map that include the options added with AddOptions.
Definition: requestor.hpp:155
SimpleDaqRequestor::Synopsis
std::string Synopsis() override
Definition: requestor.hpp:127
UpdateKeywordsRequestor
Definition: requestor.hpp:187
UpdateKeywordsRequestor::AddOptions
void AddOptions(boost::program_options::options_description &descr) override
Add arguments to command.
Definition: requestor.cpp:180
Requestor
Definition: requestor.hpp:52