#include "app/CliArgs.hpp" #include "migration/MigrationApplication.hpp" #include "util/build/Build.hpp" #include "util/config/ConfigDescription.hpp" #include #include #include #include #include #include #include #include #include #include #include namespace app { CliArgs::Action CliArgs::parse(int argc, char const* argv[]) { namespace po = boost::program_options; // clang-format off po::options_description description("Options"); description.add_options() ("help,h", "Print help message and exit") ("version,v", "Print version and exit") ("conf,c", po::value()->default_value(kDEFAULT_CONFIG_PATH), "Configuration file") ("ng-web-server,w", "Use ng-web-server") ("migrate", po::value(), "Start migration helper") ("verify", "Checks the validity of config values") ("config-description,d", po::value(), "Generate config description markdown file") ; // clang-format on po::positional_options_description positional; positional.add("conf", 1); auto const printHelp = [&description]() { std::cout << "Clio server " << util::build::getClioFullVersionString() << "\n\n" << description; }; po::variables_map parsed; try { po::store( po::command_line_parser(argc, argv).options(description).positional(positional).run(), parsed ); po::notify(parsed); } catch (po::error const& e) { std::cerr << "Error: " << e.what() << std::endl << std::endl; printHelp(); return Action{Action::Exit{EXIT_FAILURE}}; } if (parsed.contains("help")) { printHelp(); return Action{Action::Exit{EXIT_SUCCESS}}; } if (parsed.contains("version")) { std::cout << util::build::getClioFullVersionString() << '\n' << "Git commit hash: " << util::build::getGitCommitHash() << '\n' << "Git build branch: " << util::build::getGitBuildBranch() << '\n' << "Build date: " << util::build::getBuildDate() << '\n'; return Action{Action::Exit{EXIT_SUCCESS}}; } if (parsed.contains("config-description")) { std::filesystem::path const filePath = parsed["config-description"].as(); auto const res = util::config::ClioConfigDescription::generateConfigDescriptionToFile(filePath); if (res.has_value()) return Action{Action::Exit{EXIT_SUCCESS}}; std::cerr << res.error().error << std::endl; return Action{Action::Exit{EXIT_FAILURE}}; } auto configPath = parsed["conf"].as(); if (parsed.contains("migrate")) { auto const opt = parsed["migrate"].as(); if (opt == "status") { return Action{Action::Migrate{ .configPath = std::move(configPath), .subCmd = MigrateSubCmd::status() }}; } return Action{Action::Migrate{ .configPath = std::move(configPath), .subCmd = MigrateSubCmd::migration(opt) }}; } if (parsed.contains("verify")) return Action{Action::VerifyConfig{.configPath = std::move(configPath)}}; return Action{Action::Run{ .configPath = std::move(configPath), .useNgWebServer = parsed.contains("ng-web-server") }}; } } // namespace app