-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgramOptions.cpp
95 lines (68 loc) · 2.19 KB
/
ProgramOptions.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "ProgramOptions.h"
#include "BuildStatusReporter.h"
#include <string>
#include <chrono>
#include <vector>
#include <iostream>
#include <boost/program_options.hpp>
using namespace std;
using namespace std::chrono;
using namespace boost::program_options;
ProgramOptions::ProgramOptions(int argc, char* argv[])
: optionsDesc_("Main options")
{
optionsDesc_.add_options()
("help,h", "Print this help message.")
("reporter", value<string>()->required(), "The module that will be used to report build status. (e.g. PWM, UnicornHat)")
("status-uri", value<std::vector<std::string>>()->multitoken()->composing()->required(), "The Jenkins '/api/json' url to periodically extract build status from.")
("polling-period,t", value<int>()->default_value(30), "Seconds between status updates from the Jenkins server.")
;
auto parsedOpts = command_line_parser(argc, argv).options(optionsDesc_).allow_unregistered().run();
store(parsedOpts, varsMap_);
// Process the help option.
if (isHelpRequested())
{
printHelp();
exit(0);
}
notify(varsMap_);
initReporter(argc, argv);
}
ProgramOptions::~ProgramOptions()
{
}
void ProgramOptions::printHelp() const
{
cout << optionsDesc_ << endl;
cout << BuildStatusReporterRegistry::instance().getHelpString() << endl;
}
auto ProgramOptions::isHelpRequested() const -> bool
{
return (varsMap_.count("help") > 0);
}
auto ProgramOptions::getReporterName() const -> string
{
return varsMap_["reporter"].as<string>();
}
auto ProgramOptions::getReporter() const -> BuildStatusReporter&
{
return BuildStatusReporterRegistry::instance().getReporter(getReporterName());
}
auto ProgramOptions::getStatusUris() const -> vector<string>
{
return varsMap_["status-uri"].as<vector<string>>();
}
auto ProgramOptions::getPollingPeriod() -> seconds
{
return seconds(varsMap_["polling-period"].as<int>());
}
void ProgramOptions::initReporter(int argc, char* argv[])
{
auto& reporter = getReporter();
variables_map reporterOpts;
auto desc = reporter.getOptionsDescription();
auto parsedOpts = command_line_parser(argc, argv).options(desc).allow_unregistered().run();
store(parsedOpts, reporterOpts);
notify(reporterOpts);
reporter.init(reporterOpts);
}