Saltar al contenido principal

API de argumentos

Las utilidades de esquema y análisis de argumentos CLI están disponibles bajo ptool.args y p.args.

ptool.args.arg

v0.1.0 - Introduced.

ptool.args.arg(id, kind, options) crea un builder de argumentos para usar en ptool.args.parse(...).schema.args.

  • id (string, obligatorio): El identificador del argumento. También es la clave en la tabla devuelta.
  • kind (string, obligatorio): El tipo de argumento. Valores admitidos:
    • "flag": Un flag booleano.
    • "string": Una opción de cadena.
    • "int": Una opción entera (i64).
    • "positional": Un argumento posicional.
  • options (table, opcional): Los mismos campos opcionales admitidos por las tablas de argumentos en ptool.args.parse, como long, short, help, required, multiple y default.

El builder admite métodos encadenables; todos devuelven el propio builder:

  • arg:long(value) establece el nombre de opción larga. Solo se admite en argumentos no positional.
  • arg:short(value) establece el nombre de opción corta. Solo se admite en argumentos no positional.
  • arg:help(value) establece el texto de ayuda.
  • arg:required(value) establece si el argumento es obligatorio. Si se omite value, el valor por defecto es true.
  • arg:multiple(value) establece si el argumento puede repetirse. Si se omite value, el valor por defecto es true.
  • arg:default(value) establece el valor por defecto. Si value = nil, se limpia el valor por defecto.

Ejemplo:

local res = ptool.args.parse({
args = {
ptool.args.arg("name", "string"):required(),
ptool.args.arg("verbose", "flag", { short = "v" }),
ptool.args.arg("paths", "positional"):multiple(),
}
})

ptool.args.parse

v0.1.0 - Introduced.

v0.3.0 - Added subcommands support.

ptool.args.parse(schema) analiza los argumentos del script con clap y devuelve una tabla indexada por id.

Los argumentos del script provienen de la parte posterior a -- en ptool run <lua_file> -- ....

Por ejemplo:

ptool.use("v0.1.0")

local res = ptool.args.parse({
name = "test",
about = "The test command",
args = {
{ id = "name", kind = "string" }
}
})

print("Hello, " .. res.name .. "!")

Estructura del esquema

  • name (string, opcional): El nombre del comando, usado en la salida de ayuda. Por defecto es el nombre del archivo del script.
  • about (string, opcional): Descripción de ayuda.
  • args (table, opcional): Un arreglo de definiciones de argumentos. Cada elemento admite dos formas:
    • Una tabla de argumento.
    • Un objeto builder devuelto por ptool.args.arg(...).
  • subcommands (table, opcional): Un mapa desde nombre de subcomando hasta esquema de subcomando. Cada esquema de subcomando admite about, args y subcommands de forma recursiva.

Debe proporcionarse al menos uno entre args o subcommands.

Campos de la tabla de argumento:

  • id (string, obligatorio): El identificador del argumento. También es la clave en la tabla devuelta.
  • kind (string, obligatorio): El tipo de argumento. Valores admitidos:
    • "flag": Un flag booleano.
    • "string": Una opción de cadena.
    • "int": Una opción entera (i64).
    • "positional": Un argumento posicional.
  • long (string, opcional): El nombre de la opción larga, como "name" para --name. En argumentos no positional, el valor por defecto puede derivarse de id.
  • short (string, opcional): El nombre de la opción corta, un solo carácter como "v" para -v.
  • help (string, opcional): Texto de ayuda del argumento.
  • required (boolean, opcional): Si el argumento es obligatorio. Por defecto es false.
  • multiple (boolean, opcional): Si el argumento puede repetirse. Por defecto es false.
  • default (string/integer, opcional): El valor por defecto.

Cuando subcommands está presente, args del comando actual actúa como opciones compartidas para ese árbol de comandos, y se aceptan antes o después del subcomando seleccionado.

Ejemplo con subcomandos:

local res = ptool.args.parse({
name = "demo",
args = {
ptool.args.arg("verbose", "flag", { short = "v" }),
ptool.args.arg("config", "string"),
},
subcommands = {
build = {
args = {
ptool.args.arg("release", "flag"),
},
subcommands = {
web = {
args = {
ptool.args.arg("out", "string"):required(),
},
},
},
},
clean = {
args = {
ptool.args.arg("all", "flag"),
},
},
},
})

Restricciones

  • Las siguientes restricciones se aplican tanto a tablas de argumentos como a la sintaxis builder.
  • Los argumentos no positional pueden omitir long y short. Si se omite long, se usa id automáticamente.
  • Los argumentos positional no pueden definir long, short ni default.
  • Cuando positional.multiple = true, debe ser el último argumento en args.
  • multiple = true solo se admite para string y positional.
  • default solo se admite para string e int, y no puede usarse junto con multiple = true.
  • Cuando subcommands está presente, no se permiten argumentos positional en ese mismo esquema.
  • Cuando subcommands está presente en el nivel superior, los ids de argumento command_path y args quedan reservados.
  • A lo largo de una misma ruta de subcomando seleccionada, los subcomandos ancestros y descendientes no pueden reutilizar el mismo id de argumento, porque sus valores se fusionan en una sola tabla args.

Valor devuelto

Se devuelve una tabla Lua donde las claves son id y los tipos de valor son:

  • flag -> boolean
  • string -> string (o string[] cuando multiple = true)
  • int -> integer
  • positional -> string (o string[] cuando multiple = true)

Cuando subcommands no está presente, el valor devuelto permanece plano como arriba.

Cuando subcommands está presente, el valor devuelto tiene esta forma:

  • Los valores de args del nivel superior se devuelven directamente en la tabla de nivel superior.
  • command_path -> string[]: La ruta de subcomando coincidente, por ejemplo {"build", "web"}.
  • args -> table: Los valores de argumentos fusionados de la ruta de subcomando coincidente.

Por ejemplo:

{
verbose = true,
config = "cfg.toml",
command_path = { "build", "web" },
args = {
release = true,
out = "dist",
},
}