MultiCommand: Simplify construction

(cherry picked from commit 15a16e5c05)
This commit is contained in:
Eelco Dolstra 2018-11-22 15:59:52 +01:00
parent 092af3c826
commit f1b5c76c1a
3 changed files with 15 additions and 8 deletions

View file

@ -5,7 +5,7 @@
namespace nix {
Commands * RegisterCommand::commands = 0;
std::vector<ref<Command>> * RegisterCommand::commands = 0;
void Command::printHelp(const string & programName, std::ostream & out)
{
@ -22,9 +22,11 @@ void Command::printHelp(const string & programName, std::ostream & out)
}
}
MultiCommand::MultiCommand(const Commands & _commands)
: commands(_commands)
MultiCommand::MultiCommand(const std::vector<ref<Command>> & _commands)
{
for (auto & command : _commands)
commands.emplace(command->name(), command);
expectedArgs.push_back(ExpectedArg{"command", 1, true, [=](std::vector<std::string> ss) {
assert(!command);
auto i = commands.find(ss[0]);

View file

@ -182,7 +182,7 @@ public:
std::shared_ptr<Command> command;
MultiCommand(const Commands & commands);
MultiCommand(const std::vector<ref<Command>> & commands);
void printHelp(const string & programName, std::ostream & out) override;
@ -194,12 +194,12 @@ public:
/* A helper class for registering commands globally. */
struct RegisterCommand
{
static Commands * commands;
static std::vector<ref<Command>> * commands;
RegisterCommand(ref<Command> command)
{
if (!commands) commands = new Commands;
commands->emplace(command->name(), command);
if (!commands) commands = new std::vector<ref<Command>>;
commands->push_back(command);
}
};

View file

@ -104,10 +104,15 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
"--help-config' for a list of configuration settings.\n";
}
void printHelp(const string & programName, std::ostream & out)
{
MultiCommand::printHelp(programName, out);
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
}
void showHelpAndExit()
{
printHelp(programName, std::cout);
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
throw Exit();
}
};