RTC Toolkit  0.1.0-alpha
rtcComponent.hpp
Go to the documentation of this file.
1 
9 #ifndef RTCTK_COMPONENTFRAMEWORK_DETAIL_RTCCOMPONENT_HPP
10 #define RTCTK_COMPONENTFRAMEWORK_DETAIL_RTCCOMPONENT_HPP
11 
12 #include <mal/Cii.hpp>
13 #include <boost/program_options.hpp>
14 #include <boost/core/demangle.hpp>
15 #include <iostream>
16 
18 
19 class HelpOnly : public std::runtime_error
20 {
21  public:
22  HelpOnly(const std::string& help_text)
23  : std::runtime_error(help_text) {}
24 };
25 
26 class ArgNotSet : public std::runtime_error
27 {
28  public:
29  ArgNotSet(const std::string& arg_name)
30  : std::runtime_error("Mandatory argument '" + arg_name + "' not set, use -h for help") {}
31 };
32 
33 class Args
34 {
35  public:
36  Args(int argc, char** argv)
37  : m_argc(argc)
38  , m_argv(argv)
39  {
40  Parse();
41  }
42 
43  std::string GetComponentName() const {
44  return vm["cid"].as<std::string>();
45  }
46 
47  elt::mal::Uri GetServiceDiscEndpoint() const {
48  return vm["sde"].as<elt::mal::Uri>();
49  }
50 
51  std::optional<elt::mal::Uri> GetLogPropsFile() const {
52  if (vm.count("lpf")) {
53  return {vm["lpf"].as<elt::mal::Uri>()};
54  }else {
55  return std::nullopt;
56  }
57  }
58 
59 private:
60  void Parse()
61  {
62  namespace bpo = boost::program_options;
63  using ::elt::mal::Uri;
64 
65  bpo::positional_options_description pos_opts_desc;
66  pos_opts_desc.add("cid", 1);
67  pos_opts_desc.add("sde", 1);
68 
69  bpo::options_description opts_desc("Options");
70  opts_desc.add_options()
71  ("help,h", "print help messages")
72  ("cid,i", bpo::value<std::string>(), "component identity")
73  ("sde,s", bpo::value<Uri>(), "service discovery endpoint")
74  ("lpf,l", bpo::value<Uri>(), "logging properties file");
75 
76  bpo::store(
77  bpo::command_line_parser(m_argc, m_argv)
78  .options(opts_desc)
79  .positional(pos_opts_desc)
80  .run(), vm);
81 
82  bpo::notify(vm);
83 
84  if (vm.count("help")) {
85  std::stringstream ss;
86  ss << opts_desc << std::endl;
87  throw HelpOnly(ss.str());
88  }
89 
90  if (!vm.count("cid")) {
91  throw ArgNotSet("component identity");
92  }
93 
94  if (!vm.count("sde")) {
95  throw ArgNotSet("service discovery endpoint");
96  }
97  }
98 
99  int m_argc;
100  char** m_argv;
101 
102  boost::program_options::variables_map vm;
103 };
104 
105 std::string GetTypeName(const std::type_info& tid) {
106  return boost::core::demangle(tid.name());
107 }
108 
109 } // closing namespace
110 
111 #endif
rtctk::componentFramework::detail::GetTypeName
std::string GetTypeName(const std::type_info &tid)
Definition: rtcComponent.hpp:105
rtctk::componentFramework::detail::HelpOnly
Definition: rtcComponent.hpp:20
rtctk::componentFramework::detail::ArgNotSet
Definition: rtcComponent.hpp:27
rtctk::componentFramework::detail
Definition: rtcComponent.hpp:17
rtctk::componentFramework::detail::Args
Definition: rtcComponent.hpp:34
rtctk::componentFramework::detail::ArgNotSet::ArgNotSet
ArgNotSet(const std::string &arg_name)
Definition: rtcComponent.hpp:29
rtctk::componentFramework::detail::Args::GetComponentName
std::string GetComponentName() const
Definition: rtcComponent.hpp:43
rtctk::componentFramework::detail::HelpOnly::HelpOnly
HelpOnly(const std::string &help_text)
Definition: rtcComponent.hpp:22
rtctk::componentFramework::detail::Args::GetServiceDiscEndpoint
elt::mal::Uri GetServiceDiscEndpoint() const
Definition: rtcComponent.hpp:47
std
Definition: mudpiProcessingError.hpp:109
rtctk::componentFramework::detail::Args::Args
Args(int argc, char **argv)
Definition: rtcComponent.hpp:36
rtctk::componentFramework::detail::Args::GetLogPropsFile
std::optional< elt::mal::Uri > GetLogPropsFile() const
Definition: rtcComponent.hpp:51