DDS  ver. 3.6
dds-agent/src/Options.h
Go to the documentation of this file.
1 // Copyright 2014 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDSOPTIONS_H
6 #define DDSOPTIONS_H
7 //=============================================================================
8 // STD
9 #include <stdexcept>
10 #include <string>
11 // BOOST
12 #include <boost/program_options/options_description.hpp>
13 #include <boost/program_options/parsers.hpp>
14 // DDS
15 #include "Logger.h"
16 #include "UserDefaults.h"
17 //=============================================================================
18 namespace bpo = boost::program_options;
19 //=============================================================================
20 namespace dds
21 {
22  namespace agent_cmd
23  {
25  typedef struct SOptions
26  {
27  enum ECommands
28  {
32  };
34  {
35  }
36 
37  static ECommands getCommandByName(const std::string& _name)
38  {
39  if ("start" == _name)
40  return cmd_start;
41  else if ("clean" == _name)
42  return cmd_clean;
43 
44  return cmd_unknown;
45  }
46 
48  size_t m_slots{ 0 };
49  } SOptions_t;
50 
51  // Command line parser
52  inline bool ParseCmdLine(int _argc, char* _argv[], SOptions* _options)
53  {
54  if (nullptr == _options)
55  throw std::runtime_error("Internal error: options' container is empty.");
56 
57  // Generic options
58  bpo::options_description options("dds-agent options");
59  options.add_options()("help,h", "Produce help message");
60  options.add_options()("version,v", "Version information");
61  options.add_options()("command",
62  bpo::value<std::string>(),
63  "The command is a name of dds-agent command."
64  " Can be one of the following: start, clean.\n"
65  "For user's convenience it is allowed to call dds-agent without \"--command\" option"
66  " by just specifying the command name directly, like:\ndds-agent start.\n\n"
67  "Commands:\n"
68  " start: \tStart dds-agent\n"
69  " clean: \tCleaning");
70  options.add_options()(
71  "slots,s", bpo::value<size_t>(&_options->m_slots), "Defines a number of task slots per agent.");
72 
73  //...positional
74  bpo::positional_options_description pd;
75  pd.add("command", 1);
76 
77  // Parsing command-line
78  bpo::variables_map vm;
79  bpo::store(bpo::command_line_parser(_argc, _argv).options(options).positional(pd).run(), vm);
80  bpo::notify(vm);
81 
82  if (vm.count("help") || vm.empty())
83  {
84  LOG(dds::misc::log_stdout) << options;
85  return false;
86  }
87  if (vm.count("version"))
88  {
89  LOG(dds::misc::log_stdout) << dds::misc::DDSVersionInfoString();
90  return false;
91  }
92 
93  // Command
94  if (vm.count("command"))
95  {
96  if (SOptions::cmd_unknown == SOptions::getCommandByName(vm["command"].as<std::string>()))
97  {
99  << "DDS error: unknown command: " << vm["command"].as<std::string>() << "\n\n"
100  << options;
101  return false;
102  }
103  }
104  else
105  {
106  LOG(dds::misc::log_stderr) << "DDS: Nothing to do\n\n" << options;
107  return false;
108  }
109 
110  _options->m_Command = SOptions::getCommandByName(vm["command"].as<std::string>());
111 
112  return true;
113  }
114  } // namespace agent_cmd
115 } // namespace dds
116 #endif
SOptions()
Definition: dds-agent/src/Options.h:33
#define LOG(severity)
Definition: Logger.h:34
Definition: def.h:151
struct dds::agent_cmd::SOptions SOptions_t
dds-commander's container of options
Miscellaneous functions and helpers are located here.
Definition: AgentConnectionManager.h:13
dds-commander's container of options
Definition: dds-agent/src/Options.h:25
bool ParseCmdLine(int _argc, char *_argv[], SOptions *_options)
Definition: dds-agent/src/Options.h:52
Definition: dds-agent/src/Options.h:29
static ECommands getCommandByName(const std::string &_name)
Definition: dds-agent/src/Options.h:37
Definition: dds-agent/src/Options.h:31
Definition: def.h:153
size_t m_slots
Definition: dds-agent/src/Options.h:48
ECommands m_Command
Definition: dds-agent/src/Options.h:47
Definition: dds-agent/src/Options.h:30
ECommands
Definition: dds-agent/src/Options.h:27