Skip to content

Commit

Permalink
Better integration with core
Browse files Browse the repository at this point in the history
  • Loading branch information
apolukhin committed Nov 29, 2024
1 parent b57fb5c commit d9f0cc6
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 31 deletions.
18 changes: 15 additions & 3 deletions core/include/userver/utils/daemon_run.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,34 @@

#include <userver/components/component_list.hpp>


namespace boost::program_options {
class options_description;
class variables_map;
}

USERVER_NAMESPACE_BEGIN

namespace utils {

/// Parses command line arguments and calls components::Run with config file
/// from --config parameter.
/// @returns default options of DaemonMain
///
/// Other command line arguments:
/// List of options:
/// * --help - show all command line arguments
/// * --config CONFIG - path to config.yaml
/// * --config_vars CONFIG_VARS - path to config_vars.yaml
/// * --config_vars_override CONFIG_VARS - path to config_vars.override.yaml
/// * --print-config-schema - print config.yaml YAML Schema
/// * --print-dynamic-config-defaults - print JSON with dynamic config defaults
boost::program_options::options_description BaseRunOptions();

/// Parses command line arguments and calls components::Run with config file
/// from --config parameter. See BaseRunOptions() for a list of options
int DaemonMain(int argc, const char* const argv[], const components::ComponentList& components_list);

/// @overload
int DaemonMain(const boost::program_options::variables_map& vm, const components::ComponentList& components_list);

} // namespace utils

USERVER_NAMESPACE_END
54 changes: 31 additions & 23 deletions core/src/utils/daemon_run.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,38 @@ namespace utils {

namespace {

std::optional<std::string> ToOptional(std::string&& s) {
if (s.empty())
template <class Value>
std::optional<std::string> ToOptional(const Value& val) {
if (val.empty())
return {};
else
return {std::move(s)};
return {val.template as<std::string>()};
}

} // namespace

int DaemonMain(const int argc, const char* const argv[], const components::ComponentList& components_list) {
utils::impl::FinishStaticRegistration();

boost::program_options::options_description BaseRunOptions() {
namespace po = boost::program_options;

po::variables_map vm;
po::options_description desc("Allowed options");
std::string config_path;
std::string config_vars_path;
std::string config_vars_override_path;

// clang-format off
desc.add_options()
("help,h", "produce this help message")
("print-config-schema", "print config.yaml YAML Schema")
("print-dynamic-config-defaults", "print JSON object with dynamic config defaults")
("config,c", po::value(&config_path)->required(), "path to server config")
("config_vars", po::value(&config_vars_path), "path to config_vars.yaml; if set, config_vars in config.yaml are ignored")
("config_vars_override", po::value(&config_vars_override_path), "path to an additional config_vars.yaml, which overrides vars of config_vars.yaml")
;
desc.add_options()
("help,h", "produce this help message")
("print-config-schema", "print config.yaml YAML Schema")
("print-dynamic-config-defaults", "print JSON object with dynamic config defaults")
("config_vars", po::value<std::string>(), "path to config_vars.yaml; if set, config_vars in config.yaml are ignored")
("config_vars_override", po::value<std::string>(), "path to an additional config_vars.yaml, which overrides vars of config_vars.yaml")
;
// clang-format on
return desc;
}

int DaemonMain(const int argc, const char* const argv[], const components::ComponentList& components_list) {
namespace po = boost::program_options;
po::variables_map vm;
auto desc = BaseRunOptions();
desc.add_options()
("config,c", po::value<std::string>()->required(), "path to server config")
;

try {
po::store(po::parse_command_line(argc, argv, desc), vm);
Expand All @@ -59,6 +61,12 @@ int DaemonMain(const int argc, const char* const argv[], const components::Compo
return 0;
}

return DaemonMain(vm, components_list);
}

int DaemonMain(const boost::program_options::variables_map& vm, const components::ComponentList& components_list) {
utils::impl::FinishStaticRegistration();

if (vm.count("print-config-schema")) {
std::cout << components::impl::GetStaticConfigSchema(components_list) << "\n";
return 0;
Expand All @@ -71,9 +79,9 @@ int DaemonMain(const int argc, const char* const argv[], const components::Compo

try {
components::Run(
config_path,
ToOptional(std::move(config_vars_path)),
ToOptional(std::move(config_vars_override_path)),
vm["config"].as<std::string>(),
ToOptional(vm["config_vars"]),
ToOptional(vm["config_vars_override"]),
components_list
);
return 0;
Expand Down
15 changes: 10 additions & 5 deletions libraries/easy/src/easy.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <userver/easy.hpp>

#include <fstream>
#include <iostream>
#include <unordered_map>

#include <boost/algorithm/string/replace.hpp>
Expand Down Expand Up @@ -104,22 +105,27 @@ HttpBase::~HttpBase() {
AddComponentsConfig(fmt::format(kConfigLoggingTemplate, ToString(level_)));

namespace po = boost::program_options;

po::variables_map vm;
po::options_description desc("Easy options");
auto desc = utils::BaseRunOptions();
std::string config_dump;
std::string schema_dump;

// clang-format off
desc.add_options()
("dump-config", po::value(&config_dump), "path to dump the server config")
("dump-schema", po::value(&schema_dump), "path to dump the DB schema")
("config,c", po::value<std::string>(), "path to server config")
;
// clang-format on

po::store(po::command_line_parser(argc_, argv_).options(desc).allow_unregistered().run(), vm);
po::store(po::parse_command_line(argc_, argv_, desc), vm);
po::notify(vm);

if (vm.count("help")) {
std::cerr << desc << '\n';
return;
}

if (vm.count("dump-config")) {
std::ofstream(config_dump) << static_config_;
return;
Expand All @@ -131,9 +137,8 @@ HttpBase::~HttpBase() {

if (argc_ <= 1) {
components::Run(components::InMemoryConfig{static_config_}, component_list_);
return;
} else {
const auto ret = utils::DaemonMain(argc_, argv_, component_list_);
const auto ret = utils::DaemonMain(vm, component_list_);
if (ret != 0) {
std::exit(ret);
}
Expand Down

0 comments on commit d9f0cc6

Please sign in to comment.