CmdLineClient::Settings CmdLineClient::parseSettings()

in mcrouter/lib/carbon/CmdLineClient.cpp [32:124]


CmdLineClient::Settings CmdLineClient::parseSettings(
    int argc,
    const char** argv) {
  Settings settings;

  namespace po = boost::program_options;

  // Named options
  po::options_description namedOpts("Allowed options");
  namedOpts.add_options()("help", "Print this help message")(
      "host,h",
      po::value<std::string>(&settings.clientOptions.host),
      "The hostname/IPAddress of the carbon server")(
      "port,p",
      po::value<uint16_t>(&settings.clientOptions.port),
      "The port of the carbon server")(
      "timeout,t",
      po::value<size_t>(&settings.clientOptions.serverTimeoutMs),
      "The timeout in milliseconds")(
      "use-ssl",
      po::bool_switch(&settings.clientOptions.useSsl)->default_value(false),
      "Whether or not to use SSL")(
      "sslCertPath",
      po::value<std::string>(&settings.clientOptions.pemCertPath),
      "The SSL cert pem path")(
      "sslKeyPath",
      po::value<std::string>(&settings.clientOptions.pemKeyPath),
      "The SSL key pem path")(
      "sslCaPath",
      po::value<std::string>(&settings.clientOptions.pemCaPath),
      "The SSL CA pem path")(
      "sslServiceIdentity",
      po::value<std::string>(&settings.clientOptions.sslServiceIdentity),
      "The SSL service identity")(
      "stop-on-error",
      po::bool_switch(&settings.clientOptions.ignoreParsingErrors)
          ->default_value(true),
      "Do not send the requests if any error is found");

  // Positional arguments - hidden from the help message
  po::options_description hiddenOpts("Hidden options");
  hiddenOpts.add_options()(
      "requestName",
      po::value<std::string>(&settings.requestName),
      "The name of the request to send")(
      "data",
      po::value<std::string>(&settings.data),
      "The actual request(s) to send");
  po::positional_options_description posArgs;
  posArgs.add("requestName", 1);
  posArgs.add("data", 1);

  // Parse command line
  po::variables_map vm;
  try {
    // Build all options
    po::options_description allOpts;
    allOpts.add(namedOpts).add(hiddenOpts);

    // Parse
    po::store(
        po::command_line_parser(argc, argv)
            .options(allOpts)
            .positional(posArgs)
            .run(),
        vm);
    po::notify(vm);
  } catch (po::error& ex) {
    targetErr_ << ex.what() << std::endl;
    exit(1);
  }

  // Validate args
  bool error = false;
  if (settings.requestName.empty()) {
    error = true;
    targetErr_ << "ERROR: No request name provided." << std::endl;
  } else if (settings.data.empty()) {
    error = true;
    targetErr_ << "ERROR: No request data provided." << std::endl;
  }

  // Handles help
  if (vm.count("help") || error) {
    targetErr_ << getUsage(argv[0]) << std::endl;

    // Print only named options
    namedOpts.print(targetErr_);
    exit(0);
  }

  return settings;
}