CbmRoot
Loading...
Searching...
No Matches
FeederOptions.cxx
Go to the documentation of this file.
1/* Copyright (C) 2025 Jagiellonian University, Krakow
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Bartosz Sobol [committer] */
4
5#include "FeederOptions.h"
6
7#include "log.hpp"
8
9#include <boost/program_options.hpp>
10
11#include <iostream>
12
13#include <fmt/format.h>
14
15namespace po = boost::program_options;
16
17FeederOptions::FeederOptions(int argc, char** argv)
18{
19 uint32_t logLevel{severity_level::status};
20 uint32_t logSyslog{severity_level::status};
21 std::string logFile{};
22
23 po::options_description options("Options");
24
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 "
37 "(default: 0)");
38 addOption("stride", po::value<uint64_t>(&fStride)->value_name("N")->default_value(1),
39 "set the stride of RecoResults to select for processing "
40 "(default: 1)");
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: "
45 "unlimited)");
46
47 po::variables_map vm;
48 po::store(po::parse_command_line(argc, argv, options), vm);
49 po::notify(vm);
50
51 if (vm.count("help") != 0) {
52 std::cout << options << std::endl;
53 exit(EXIT_SUCCESS);
54 }
55
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));
60 }
61 if (vm.count("log-syslog") != 0u) {
62 logging::add_syslog(logging::syslog::local0, static_cast<severity_level>(logSyslog));
63 }
64
65 if (vm.count("output-uri") != 0) {
66 fOutputs = vm["output-uri"].as<std::vector<std::string>>();
67 }
68
69 if (vm.count("input-uri") == 0) {
70 throw std::runtime_error("[FeederOptions] No input source specified");
71 }
72 if (vm.count("input-uri") > 1) {
73 throw std::runtime_error("[FeederOptions] More than one input source specified");
74 }
75
76 if (fStride == 0) {
77 throw std::runtime_error("[FeederOptions] Stride must be greater than zero");
78 }
79}
#define L_(level)
std::vector< std::string > fOutputs
uint64_t fMaximumNumber
FeederOptions()=delete
uint64_t fOffset
std::string fInput
uint64_t fStride