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:

  1. We define a main parser and then add subcommands to it, rather than creating separate FlagSets.
  2. Flag parsing is handled automatically when we call parser:parse().
  3. We use Lua’s conditional statements to check which subcommand was invoked, rather than a switch statement.
  4. 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.