parent
38374a9d35
commit
112ff7833d
|
@ -146,7 +146,7 @@ bool Args::processArgs(const Strings & args, bool finish)
|
|||
res = true;
|
||||
}
|
||||
|
||||
if (finish && !expectedArgs.empty())
|
||||
if (finish && !expectedArgs.empty() && !expectedArgs.front().optional)
|
||||
throw UsageError("more arguments are required");
|
||||
|
||||
return res;
|
||||
|
|
|
@ -51,6 +51,7 @@ protected:
|
|||
{
|
||||
std::string label;
|
||||
size_t arity; // 0 = any
|
||||
bool optional;
|
||||
std::function<void(Strings)> handler;
|
||||
};
|
||||
|
||||
|
@ -165,7 +166,7 @@ public:
|
|||
/* Expect a string argument. */
|
||||
void expectArg(const std::string & label, string * dest)
|
||||
{
|
||||
expectedArgs.push_back(ExpectedArg{label, 1, [=](Strings ss) {
|
||||
expectedArgs.push_back(ExpectedArg{label, 1, false, [=](Strings ss) {
|
||||
*dest = ss.front();
|
||||
}});
|
||||
}
|
||||
|
@ -173,7 +174,7 @@ public:
|
|||
/* Expect 0 or more arguments. */
|
||||
void expectArgs(const std::string & label, Strings * dest)
|
||||
{
|
||||
expectedArgs.push_back(ExpectedArg{label, 0, [=](Strings ss) {
|
||||
expectedArgs.push_back(ExpectedArg{label, 0, false, [=](Strings ss) {
|
||||
*dest = ss;
|
||||
}});
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ void Command::printHelp(const string & programName, std::ostream & out)
|
|||
MultiCommand::MultiCommand(const Commands & _commands)
|
||||
: commands(_commands)
|
||||
{
|
||||
expectedArgs.push_back(ExpectedArg{"command", 1, [=](Strings ss) {
|
||||
expectedArgs.push_back(ExpectedArg{"command", 1, true, [=](Strings ss) {
|
||||
assert(!command);
|
||||
auto i = commands.find(ss.front());
|
||||
if (i == commands.end())
|
||||
|
|
|
@ -15,11 +15,7 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
|||
{
|
||||
NixArgs() : MultiCommand(*RegisterCommand::commands), MixCommonArgs("nix")
|
||||
{
|
||||
mkFlag('h', "help", "show usage information", [=]() {
|
||||
printHelp(programName, std::cout);
|
||||
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
|
||||
throw Exit();
|
||||
});
|
||||
mkFlag('h', "help", "show usage information", [&]() { showHelpAndExit(); });
|
||||
|
||||
mkFlag(0, "help-config", "show configuration options", [=]() {
|
||||
std::cout << "The following configuration options are available:\n\n";
|
||||
|
@ -47,6 +43,13 @@ struct NixArgs : virtual MultiCommand, virtual MixCommonArgs
|
|||
"Boolean settings can be overriden using ‘--<name>’ or ‘--no-<name>’. See ‘nix\n"
|
||||
"--help-config’ for a list of configuration settings.\n";
|
||||
}
|
||||
|
||||
void showHelpAndExit()
|
||||
{
|
||||
printHelp(programName, std::cout);
|
||||
std::cout << "\nNote: this program is EXPERIMENTAL and subject to change.\n";
|
||||
throw Exit();
|
||||
}
|
||||
};
|
||||
|
||||
void mainWrapped(int argc, char * * argv)
|
||||
|
@ -68,7 +71,7 @@ void mainWrapped(int argc, char * * argv)
|
|||
|
||||
args.parseCmdline(argvToStrings(argc, argv));
|
||||
|
||||
assert(args.command);
|
||||
if (!args.command) args.showHelpAndExit();
|
||||
|
||||
StartProgressBar bar;
|
||||
|
||||
|
|
Loading…
Reference in a new issue