MultiCommand: Simplify construction

This commit is contained in:
Eelco Dolstra
2019-02-11 11:55:22 +01:00
parent aa0e2a2e70
commit 15a16e5c05
3 changed files with 15 additions and 8 deletions
+5 -3
View File
@@ -4,7 +4,7 @@
namespace nix {
Commands * RegisterCommand::commands = 0;
std::vector<ref<Command>> * RegisterCommand::commands = 0;
void Command::printHelp(const string & programName, std::ostream & out)
{
@@ -21,9 +21,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]);
+4 -4
View File
@@ -173,7 +173,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;
@@ -185,12 +185,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);
}
};
+6 -1
View File
@@ -57,10 +57,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();
}
};