void NestedCommandLineApp::doRun(const std::vector<std::string>& args) { if (programName_.empty()) { programName_ = guessProgramName(); } auto parsed = parseNestedCommandLine(args, globalOptions_); po::variables_map vm; po::store(parsed.options, vm); if (vm.count("help")) { std::vector<std::string> helpArgs; if (parsed.command) { helpArgs.push_back(*parsed.command); } displayHelp(vm, helpArgs); return; } if (vm.count("version")) { printf("%s %s\n", programName_.c_str(), version_.c_str()); return; } if (!parsed.command) { throw ProgramExit( 1, folly::sformat("Command not specified. Run `{} help' for help.", programName_)); } auto& p = findCommand(*parsed.command); auto& cmd = p.first; auto& info = p.second; auto cmdOptions = po::command_line_parser(parsed.rest).options(info.options).run(); po::store(cmdOptions, vm); po::notify(vm); auto cmdArgs = po::collect_unrecognized(cmdOptions.options, po::include_positional); if (initFunction_) { initFunction_(cmd, vm, cmdArgs); } info.command(vm, cmdArgs); }
void NestedCommandLineApp::doRun(const std::vector<std::string>& args) { if (programName_.empty()) { programName_ = guessProgramName(); } bool not_clean = false; std::vector<std::string> cleanArgs; std::vector<std::string> endArgs; for (auto& na : args) { if (na == "--") { not_clean = true; } else if (not_clean) { endArgs.push_back(na); } else { cleanArgs.push_back(na); } } auto parsed = parseNestedCommandLine(cleanArgs, globalOptions_); po::variables_map vm; po::store(parsed.options, vm); if (vm.count(kHelpCommand.str())) { std::vector<std::string> helpArgs; if (parsed.command) { helpArgs.push_back(*parsed.command); } displayHelp(vm, helpArgs); return; } if (vm.count(kVersionCommand.str())) { displayVersion(); return; } if (!parsed.command) { throw ProgramExit( 1, folly::sformat( "Command not specified. Run '{} {}' for help.", programName_, kHelpCommand)); } auto& p = findCommand(*parsed.command); auto& cmd = p.first; auto& info = p.second; auto cmdOptions = po::command_line_parser(parsed.rest).options(info.options).run(); po::store(cmdOptions, vm); po::notify(vm); auto cmdArgs = po::collect_unrecognized(cmdOptions.options, po::include_positional); cmdArgs.insert(cmdArgs.end(), endArgs.begin(), endArgs.end()); if (initFunction_) { initFunction_(cmd, vm, cmdArgs); } info.command(vm, cmdArgs); }