DDS  ver. 3.4
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 "Res.h"
17 #include "UserDefaults.h"
18 #include "version.h"
19 //=============================================================================
20 namespace bpo = boost::program_options;
21 //=============================================================================
22 namespace dds
23 {
24  namespace agent_cmd
25  {
27  typedef struct SOptions
28  {
29  enum ECommands
30  {
34  };
36  {
37  }
38 
39  static ECommands getCommandByName(const std::string& _name)
40  {
41  if ("start" == _name)
42  return cmd_start;
43  else if ("clean" == _name)
44  return cmd_clean;
45 
46  return cmd_unknown;
47  }
48 
50  size_t m_slots{ 0 };
51  } SOptions_t;
52  //=============================================================================
53  inline void PrintVersion()
54  {
55  LOG(MiscCommon::log_stdout) << PROJECT_NAME << " v" << PROJECT_VERSION_STRING << "\n"
56  << "DDS configuration"
57  << " v" << USER_DEFAULTS_CFG_VERSION << "\n"
59  }
60  //=============================================================================
61  // Command line parser
62  inline bool ParseCmdLine(int _argc, char* _argv[], SOptions* _options)
63  {
64  if (nullptr == _options)
65  throw std::runtime_error("Internal error: options' container is empty.");
66 
67  // Generic options
68  bpo::options_description options("dds-agent options");
69  options.add_options()("help,h", "Produce help message");
70  options.add_options()("version,v", "Version information");
71  options.add_options()("command",
72  bpo::value<std::string>(),
73  "The command is a name of dds-agent command."
74  " Can be one of the following: start, clean.\n"
75  "For user's convenience it is allowed to call dds-agent without \"--command\" option"
76  " by just specifying the command name directly, like:\ndds-agent start.\n\n"
77  "Commands:\n"
78  " start: \tStart dds-agent\n"
79  " clean: \tCleaning");
80  options.add_options()(
81  "slots,s", bpo::value<size_t>(&_options->m_slots), "Defines a number of task slots per agent.");
82 
83  //...positional
84  bpo::positional_options_description pd;
85  pd.add("command", 1);
86 
87  // Parsing command-line
88  bpo::variables_map vm;
89  bpo::store(bpo::command_line_parser(_argc, _argv).options(options).positional(pd).run(), vm);
90  bpo::notify(vm);
91 
92  if (vm.count("help") || vm.empty())
93  {
94  LOG(MiscCommon::log_stdout) << options;
95  return false;
96  }
97  if (vm.count("version"))
98  {
99  PrintVersion();
100  return false;
101  }
102 
103  // Command
104  if (vm.count("command"))
105  {
106  if (SOptions::cmd_unknown == SOptions::getCommandByName(vm["command"].as<std::string>()))
107  {
109  << PROJECT_NAME << " error: unknown command: " << vm["command"].as<std::string>() << "\n\n"
110  << options;
111  return false;
112  }
113  }
114  else
115  {
116  LOG(MiscCommon::log_stderr) << PROJECT_NAME << ": Nothing to do\n\n" << options;
117  return false;
118  }
119 
120  _options->m_Command = SOptions::getCommandByName(vm["command"].as<std::string>());
121 
122  return true;
123  }
124  } // namespace agent_cmd
125 } // namespace dds
126 #endif
Definition: def.h:156
void PrintVersion()
Definition: dds-agent/src/Options.h:53
Definition: def.h:154
SOptions()
Definition: dds-agent/src/Options.h:35
#define LOG(severity)
Definition: Logger.h:56
struct dds::agent_cmd::SOptions SOptions_t
dds-commander's container of options
const LPCSTR g_cszReportBugsAddr("Report bugs/comments to fairroot@gsi.de")
Definition: AgentConnectionManager.h:13
dds-commander's container of options
Definition: dds-agent/src/Options.h:27
bool ParseCmdLine(int _argc, char *_argv[], SOptions *_options)
Definition: dds-agent/src/Options.h:62
Definition: dds-agent/src/Options.h:31
static ECommands getCommandByName(const std::string &_name)
Definition: dds-agent/src/Options.h:39
Definition: dds-agent/src/Options.h:33
size_t m_slots
Definition: dds-agent/src/Options.h:50
ECommands m_Command
Definition: dds-agent/src/Options.h:49
Definition: dds-agent/src/Options.h:32
ECommands
Definition: dds-agent/src/Options.h:29