9 #ifndef FAIR_MQ_SDK_COMMANDFACTORY
10 #define FAIR_MQ_SDK_COMMANDFACTORY
12 #include <fairmq/States.h>
17 #include <type_traits>
20 namespace fair::mq::sdk::cmd
23 enum class Format : int {
28 enum class Result : int {
38 subscribe_to_state_change,
39 unsubscribe_from_state_change,
40 state_change_exiting_received,
43 subscription_heartbeat,
48 state_change_subscription,
49 state_change_unsubscription,
57 explicit Cmd(
const Type type) : fType(type) {}
58 virtual ~Cmd() =
default;
60 Type GetType()
const {
return fType; }
71 struct ChangeState : Cmd
74 :
Cmd(Type::change_state)
75 , fTransition(transition)
78 Transition GetTransition()
const {
return fTransition; }
79 void SetTransition(Transition transition) { fTransition = transition; }
82 Transition fTransition;
85 struct DumpConfig : Cmd
87 explicit DumpConfig() : Cmd(Type::dump_config) {}
90 struct SubscribeToStateChange : Cmd
93 :
Cmd(Type::subscribe_to_state_change)
97 int64_t GetInterval()
const {
return fInterval; }
98 void SetInterval(int64_t interval) { fInterval = interval; }
104 struct UnsubscribeFromStateChange : Cmd
106 explicit UnsubscribeFromStateChange() : Cmd(Type::unsubscribe_from_state_change) {}
109 struct StateChangeExitingReceived : Cmd
117 :
Cmd(Type::get_properties)
118 , fRequestId(request_id)
119 , fQuery(std::move(query))
122 auto GetRequestId() const -> std::
size_t {
return fRequestId; }
123 auto SetRequestId(std::size_t requestId) ->
void { fRequestId = requestId; }
124 auto GetQuery() const -> std::
string {
return fQuery; }
125 auto SetQuery(std::string query) ->
void { fQuery = std::move(query); }
128 std::size_t fRequestId;
132 struct SetProperties : Cmd
134 SetProperties(std::size_t request_id, std::vector<std::pair<std::string, std::string>> properties)
135 : Cmd(Type::set_properties)
136 , fRequestId(request_id)
137 , fProperties(std::move(properties))
140 auto GetRequestId() const -> std::
size_t {
return fRequestId; }
141 auto SetRequestId(std::size_t requestId) ->
void { fRequestId = requestId; }
142 auto GetProps() const -> std::vector<std::pair<std::
string, std::
string>> {
return fProperties; }
143 auto SetProps(std::vector<std::pair<std::string, std::string>> properties) ->
void { fProperties = std::move(properties); }
146 std::size_t fRequestId;
147 std::vector<std::pair<std::string, std::string>> fProperties;
150 struct SubscriptionHeartbeat : Cmd
152 explicit SubscriptionHeartbeat(int64_t interval)
153 : Cmd(Type::subscription_heartbeat)
154 , fInterval(interval)
157 int64_t GetInterval()
const {
return fInterval; }
158 void SetInterval(int64_t interval) { fInterval = interval; }
164 struct CurrentState : Cmd
166 explicit CurrentState(
const std::string&
id, State currentState)
167 : Cmd(Type::current_state)
169 , fCurrentState(currentState)
172 std::string GetDeviceId()
const {
return fDeviceId; }
173 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
174 fair::mq::State GetCurrentState()
const {
return fCurrentState; }
175 void SetCurrentState(fair::mq::State state) { fCurrentState = state; }
178 std::string fDeviceId;
179 fair::mq::State fCurrentState;
182 struct TransitionStatus : Cmd
184 explicit TransitionStatus(
const std::string& deviceId,
const uint64_t taskId,
const Result result,
const Transition transition, State currentState)
185 : Cmd(Type::transition_status)
186 , fDeviceId(deviceId)
189 , fTransition(transition)
190 , fCurrentState(currentState)
193 std::string GetDeviceId()
const {
return fDeviceId; }
194 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
195 uint64_t GetTaskId()
const {
return fTaskId; }
196 void SetTaskId(
const uint64_t taskId) { fTaskId = taskId; }
197 Result GetResult()
const {
return fResult; }
198 void SetResult(
const Result result) { fResult = result; }
199 Transition GetTransition()
const {
return fTransition; }
200 void SetTransition(
const Transition transition) { fTransition = transition; }
201 fair::mq::State GetCurrentState()
const {
return fCurrentState; }
202 void SetCurrentState(fair::mq::State state) { fCurrentState = state; }
205 std::string fDeviceId;
208 Transition fTransition;
209 fair::mq::State fCurrentState;
214 explicit Config(
const std::string&
id,
const std::string& config)
220 std::string GetDeviceId()
const {
return fDeviceId; }
221 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
222 std::string GetConfig()
const {
return fConfig; }
223 void SetConfig(
const std::string& config) { fConfig = config; }
226 std::string fDeviceId;
230 struct StateChangeSubscription : Cmd
232 explicit StateChangeSubscription(
const std::string&
id,
const uint64_t taskId,
const Result result)
233 : Cmd(Type::state_change_subscription)
239 std::string GetDeviceId()
const {
return fDeviceId; }
240 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
241 uint64_t GetTaskId()
const {
return fTaskId; }
242 void SetTaskId(
const uint64_t taskId) { fTaskId = taskId; }
243 Result GetResult()
const {
return fResult; }
244 void SetResult(
const Result result) { fResult = result; }
247 std::string fDeviceId;
252 struct StateChangeUnsubscription : Cmd
254 explicit StateChangeUnsubscription(
const std::string&
id,
const uint64_t taskId,
const Result result)
255 : Cmd(Type::state_change_unsubscription)
261 std::string GetDeviceId()
const {
return fDeviceId; }
262 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
263 uint64_t GetTaskId()
const {
return fTaskId; }
264 void SetTaskId(
const uint64_t taskId) { fTaskId = taskId; }
265 Result GetResult()
const {
return fResult; }
266 void SetResult(
const Result result) { fResult = result; }
269 std::string fDeviceId;
274 struct StateChange : Cmd
276 explicit StateChange(
const std::string& deviceId,
const uint64_t taskId,
const State lastState,
const State currentState)
277 : Cmd(Type::state_change)
278 , fDeviceId(deviceId)
280 , fLastState(lastState)
281 , fCurrentState(currentState)
284 std::string GetDeviceId()
const {
return fDeviceId; }
285 void SetDeviceId(
const std::string& deviceId) { fDeviceId = deviceId; }
286 uint64_t GetTaskId()
const {
return fTaskId; }
287 void SetTaskId(
const uint64_t taskId) { fTaskId = taskId; }
288 fair::mq::State GetLastState()
const {
return fLastState; }
289 void SetLastState(
const fair::mq::State state) { fLastState = state; }
290 fair::mq::State GetCurrentState()
const {
return fCurrentState; }
291 void SetCurrentState(
const fair::mq::State state) { fCurrentState = state; }
294 std::string fDeviceId;
296 fair::mq::State fLastState;
297 fair::mq::State fCurrentState;
300 struct Properties : Cmd
302 Properties(std::string deviceId, std::size_t requestId,
const Result result, std::vector<std::pair<std::string, std::string>> properties)
303 : Cmd(Type::properties)
304 , fDeviceId(std::move(deviceId))
305 , fRequestId(requestId)
307 , fProperties(std::move(properties))
310 auto GetDeviceId() const -> std::
string {
return fDeviceId; }
311 auto SetDeviceId(std::string deviceId) ->
void { fDeviceId = std::move(deviceId); }
312 auto GetRequestId() const -> std::
size_t {
return fRequestId; }
313 auto SetRequestId(std::size_t requestId) ->
void { fRequestId = requestId; }
314 auto GetResult() const -> Result {
return fResult; }
315 auto SetResult(Result result) ->
void { fResult = result; }
316 auto GetProps() const -> std::vector<std::pair<std::
string, std::
string>> {
return fProperties; }
317 auto SetProps(std::vector<std::pair<std::string, std::string>> properties) ->
void { fProperties = std::move(properties); }
320 std::string fDeviceId;
321 std::size_t fRequestId;
323 std::vector<std::pair<std::string, std::string>> fProperties;
326 struct PropertiesSet : Cmd {
327 PropertiesSet(std::string deviceId, std::size_t requestId, Result result)
328 : Cmd(Type::properties_set)
329 , fDeviceId(std::move(deviceId))
330 , fRequestId(requestId)
334 auto GetDeviceId() const -> std::
string {
return fDeviceId; }
335 auto SetDeviceId(std::string deviceId) ->
void { fDeviceId = std::move(deviceId); }
336 auto GetRequestId() const -> std::
size_t {
return fRequestId; }
337 auto SetRequestId(std::size_t requestId) ->
void { fRequestId = requestId; }
338 auto GetResult() const -> Result {
return fResult; }
339 auto SetResult(Result result) ->
void { fResult = result; }
342 std::string fDeviceId;
343 std::size_t fRequestId;
347 template<
typename C,
typename... Args>
348 std::unique_ptr<Cmd> make(Args&&... args)
350 return std::make_unique<C>(std::forward<Args>(args)...);
355 using container = std::vector<std::unique_ptr<Cmd>>;
356 struct CommandFormatError : std::runtime_error {
using std::runtime_error::runtime_error; };
360 template<
typename... Rest>
361 explicit Cmds(std::unique_ptr<Cmd>&& first, Rest&&... rest)
363 Unpack(std::forward<std::unique_ptr<Cmd>&&>(first), std::forward<Rest>(rest)...);
366 void Add(std::unique_ptr<Cmd>&& cmd) { fCmds.emplace_back(std::move(cmd)); }
368 template<
typename C,
typename... Args>
369 void Add(Args&&... args)
371 static_assert(std::is_base_of<Cmd, C>::value,
"Only types derived from fair::mq::cmd::Cmd are allowed");
372 Add(make<C>(std::forward<Args>(args)...));
375 Cmd& At(
size_t i) {
return *(fCmds.at(i)); }
377 size_t Size()
const {
return fCmds.size(); }
378 void Reset() { fCmds.clear(); }
380 std::string Serialize(
const Format type = Format::Binary)
const;
381 void Deserialize(
const std::string&,
const Format type = Format::Binary);
388 template <
class... Rest>
389 void Unpack(std::unique_ptr<Cmd>&& first, Rest&&... rest)
391 fCmds.emplace_back(std::move(first));
392 Unpack(std::forward<Rest>(rest)...);
396 using iterator = container::iterator;
397 using const_iterator = container::const_iterator;
399 auto begin() -> decltype(fCmds.begin()) {
return fCmds.begin(); }
400 auto end() -> decltype(fCmds.end()) {
return fCmds.end(); }
401 auto cbegin() -> decltype(fCmds.cbegin()) {
return fCmds.cbegin(); }
402 auto cend() -> decltype(fCmds.cend()) {
return fCmds.cend(); }
405 std::string GetResultName(
const Result result);
406 std::string GetTypeName(
const Type type);
408 inline std::ostream& operator<<(std::ostream& os,
const Result& result) {
return os << GetResultName(result); }
409 inline std::ostream& operator<<(std::ostream& os,
const Type& type) {
return os << GetTypeName(type); }