Command Line Subcommands in Lua
Here’s the translation of the Go code to Lua, formatted in Markdown suitable for Hugo:
Our first program demonstrates how to create command-line subcommands with their own set of flags. This is similar to how tools like git
have multiple subcommands (e.g., git commit
, git push
) each with their own options.
local argparse = require "argparse"
-- Create the main parser
local parser = argparse("command-line-subcommands", "Command-line subcommands example")
-- Define the 'foo' subcommand
local foo = parser:command("foo")
foo:flag("-e --enable", "Enable flag")
foo:option("-n --name", "Name option")
-- Define the 'bar' subcommand
local bar = parser:command("bar")
bar:option("-l --level", "Level option"):convert(tonumber)
-- Parse the arguments
local args = parser:parse()
-- Check which subcommand was invoked
if args.foo then
print("subcommand 'foo'")
print(" enable:", args.enable or false)
print(" name:", args.name or "")
print(" tail:", table.concat(args, " ", 1))
elseif args.bar then
print("subcommand 'bar'")
print(" level:", args.level or 0)
print(" tail:", table.concat(args, " ", 1))
else
print("expected 'foo' or 'bar' subcommands")
os.exit(1)
end
To run the program, save it as command-line-subcommands.lua
and use the Lua interpreter.
First, invoke the foo subcommand:
$ lua command-line-subcommands.lua foo --enable --name=joe a1 a2
subcommand 'foo'
enable: true
name: joe
tail: a1 a2
Now try bar:
$ lua command-line-subcommands.lua bar --level 8 a1
subcommand 'bar'
level: 8
tail: a1
But bar won’t accept foo’s flags:
$ lua command-line-subcommands.lua bar --enable a1
expected 'foo' or 'bar' subcommands
In this Lua version, we’re using the argparse
library to handle command-line argument parsing. This library provides similar functionality to Go’s flag
package, allowing us to define subcommands and their respective flags.
The main differences from the Go version are:
- We define a main parser and then add subcommands to it, rather than creating separate FlagSets.
- Flag parsing is handled automatically when we call
parser:parse()
. - We use Lua’s conditional statements to check which subcommand was invoked, rather than a switch statement.
- Error handling is simplified, as
argparse
will automatically print usage information if invalid arguments are provided.
This example demonstrates how to create a command-line interface with subcommands in Lua, providing similar functionality to the original Go program.