9#include <boost/program_options.hpp>
13#include <fmt/format.h>
15namespace po = boost::program_options;
19 uint32_t logLevel{severity_level::status};
20 uint32_t logSyslog{severity_level::status};
21 std::string logFile{};
23 po::options_description options(
"Options");
25 auto addOption = options.add_options();
26 addOption(
"help,h",
"produce help message");
27 addOption(
"log-level,l", po::value<unsigned>(&logLevel)->default_value(logLevel)->value_name(
"N"),
28 "set the file log level (all:0)");
29 addOption(
"log-file,L", po::value<std::string>(&logFile)->value_name(
"FILENAME"),
"name of target log file");
30 addOption(
"log-syslog", po::value<unsigned>(&logSyslog)->implicit_value(logSyslog)->value_name(
"N"),
31 "enable logging to syslog at given log level");
32 addOption(
"input-uri,i", po::value<std::string>(&
fInput)->value_name(
"URI"),
"uri of a RecoResult source");
33 addOption(
"output-uri,o",
34 po::value<std::vector<std::string>>()->multitoken()->value_name(
"scheme://host/path?param=value..."),
"");
35 addOption(
"offset", po::value<uint64_t>(&
fOffset)->value_name(
"N")->default_value(0),
36 "set the offset of RecoResults to select for processing "
38 addOption(
"stride", po::value<uint64_t>(&
fStride)->value_name(
"N")->default_value(1),
39 "set the stride of RecoResults to select for processing "
41 addOption(
"release-mode,R", po::value<bool>(&
fReleaseMode)->implicit_value(
true)->default_value(
false),
42 "copy and release each RecoResult immediately after receiving it");
43 addOption(
"maximum-number,n", po::value<uint64_t>(&
fMaximumNumber)->value_name(
"N")->default_value(UINT64_MAX),
44 "set the maximum number of RecoResults to process (default: "
48 po::store(po::parse_command_line(argc, argv, options), vm);
51 if (vm.count(
"help") != 0) {
52 std::cout << options << std::endl;
56 logging::add_console(
static_cast<severity_level
>(logLevel));
57 if (vm.count(
"log-file") != 0u) {
58 L_(info) << fmt::format(
"[FeederOptions] Logging output to file: {}", logFile);
59 logging::add_file(logFile,
static_cast<severity_level
>(logLevel));
61 if (vm.count(
"log-syslog") != 0u) {
62 logging::add_syslog(logging::syslog::local0,
static_cast<severity_level
>(logSyslog));
65 if (vm.count(
"output-uri") != 0) {
66 fOutputs = vm[
"output-uri"].as<std::vector<std::string>>();
69 if (vm.count(
"input-uri") == 0) {
70 throw std::runtime_error(
"[FeederOptions] No input source specified");
72 if (vm.count(
"input-uri") > 1) {
73 throw std::runtime_error(
"[FeederOptions] More than one input source specified");
77 throw std::runtime_error(
"[FeederOptions] Stride must be greater than zero");
std::vector< std::string > fOutputs