From 247ed9e87444ea28427a0c1c5193206595ab9171 Mon Sep 17 00:00:00 2001 From: mpeterv Date: Mon, 23 Nov 2015 15:54:31 +0300 Subject: [PATCH] New Parser/Command property 'command_target' Allows saving name of used command in a field of result target. Helpful when command callbacks are stored in a table with names as keys or when they are in submodules of some namespace. Example: local parser = argparse():command_target("command") -- Add commands... local args = parser:parse() require("namespace." .. args.command).run(args) --- spec/commands_spec.lua | 11 +++++++++++ src/argparse.lua | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/spec/commands_spec.lua b/spec/commands_spec.lua index 2a56026..97faf5c 100644 --- a/spec/commands_spec.lua +++ b/spec/commands_spec.lua @@ -23,6 +23,17 @@ describe("tests related to commands", function() assert.has_error(function() parser:parse{"-q", "install"} end, "unknown option '-q'") end) + it("uses command_target property to save command name", function() + local parser = Parser "name" + :add_help(false) + :command_target("command") + local install = parser:command "install" + install:flag "-q" "--quiet" + + local args = parser:parse{"install", "-q"} + assert.same({install = true, quiet = true, command = "install"}, args) + end) + it("allows to continue passing old options", function() local parser = Parser "name" parser:flag "-v" "--verbose" { diff --git a/src/argparse.lua b/src/argparse.lua index e60ada9..f14fe17 100644 --- a/src/argparse.lua +++ b/src/argparse.lua @@ -244,6 +244,7 @@ local Parser = class({ typechecked("require_command", "boolean"), typechecked("handle_options", "boolean"), typechecked("action", "function"), + typechecked("command_target", "string"), add_help }) @@ -260,6 +261,7 @@ local Command = class({ typechecked("require_command", "boolean"), typechecked("handle_options", "boolean"), typechecked("action", "function"), + typechecked("command_target", "string"), add_help }, Parser) @@ -1013,6 +1015,11 @@ function ParseState:pass(arg) else local command = self:get_command(arg) self.result[command._target or command._name] = true + + if self.parser._command_target then + self.result[self.parser._command_target] = command._name + end + self:switch(command) end end