#include #include #include #include #include #include // clang-format off constexpr auto ToString(spdlog::level::level_enum e) { switch (e) { case spdlog::level::trace: return "TRACE"; case spdlog::level::debug: return "DEBUG"; case spdlog::level::info: return "INFO"; case spdlog::level::warn: return "WARNING"; case spdlog::level::err: return "ERROR"; case spdlog::level::critical: return "CRITICAL"; case spdlog::level::off: return "OFF"; default: return "INVALID"; } } // clang-format on namespace po = boost::program_options; auto main(int argc, char** argv) -> int { ::testing::InitGoogleTest(&argc, argv); // Define options po::options_description desc("Allowed options"); desc.add_options()("help,h", "Print help message")("log_level,l", po::value()->default_value(SPDLOG_LEVEL_OFF), "Set log level: 0=TRACE, 1=DEBUG, 2=INFO, 3=WARN, 4=ERROR, 5=CRITICAL, 6=OFF"); // Parse command-line arguments po::variables_map vm; try { po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); if(vm["log_level"].as() < spdlog::level::level_enum::trace || vm["log_level"].as() > spdlog::level::level_enum::off) { throw std::invalid_argument{ std::format("Invalid argument value for '--log_level' option. Check option description for more details")}; } if(vm["log_level"].as() < SPDLOG_ACTIVE_LEVEL) { SPDLOG_WARN("Specified log_level '{}' is lower than max available one '{}'. Log level will be changed according to the maximum one", vm["log_level"].as(), SPDLOG_ACTIVE_LEVEL); } } catch(const std::exception& e) { SPDLOG_CRITICAL("Cmd parse error: {}", e.what()); return 1; } // Cmd options handling auto level = static_cast(vm["log_level"].as()); spdlog::set_level(level); if(level != spdlog::level::level_enum::off) { std::println("\nEnvironment setup:\n\tCurrently set log level: {}\n", ToString(spdlog::get_level())); } return RUN_ALL_TESTS(); }