-- Argument helper v1.0
-- Used to parse programs arguments
-- TODO add auto help generator
-- TODO add arg aliases
require("luautils")
argumenthelper = {}
local arguments = {}
--- Define a new argument. The arguments will be parsed in the order defined
--- inside the types table.
---@param name string the argument name
---@param fun function a function to execute when the argument is called
---@param argTypes table list of argument types, in order
function argumenthelper.defineArgument(name, fun, argTypes)
assert(not luautils.containsKey(arguments, name:lower()), "Argument already defined: "..name)
local newArg = {}
newArg.fun = fun
assert(type(argTypes) == "table", "Invalid argument. Not a table.", 2)
newArg.argTypes = argTypes
arguments[name:lower()] = newArg
end
-- Cast string argument to actual value
local function castArg(arg, argType)
local function toboolean(str)
str = str:lower()
if str == "true" or str == "1" then
return true
elseif str == "false" or str == "0" then
return false
else
return nil
end
end
if argType == "boolean" then
return toboolean(arg)
elseif argType == "number" then
return tonumber(arg)
elseif argType == "string" or argType == "any" or argType == nil then
return arg
end
error("Invalid argument type: "..argType, 2)
end
--- Parse the passed argument and its values and calls the corresponding function.
--- Returns true if the function actually executed.
---@param args table the program arguments
---@return boolean true if the function executed or false if no argument is passed
function argumenthelper.parseArgument(args)
if #args == 0 then return false end
local name = args[1]
local argument = arguments[name]
if not argument then
error("Invalid or missing argument: " .. name, 2)
end
local argTypes = argument.argTypes
if (#args - 1) < #argTypes then
error(("Missing one or more values for argument \"%s\", required %d."):format(name, #argTypes), 2)
end
local values = {}
for i, argType in ipairs(argTypes) do
local argValue = args[i + 1]
local casted = castArg(argValue, argType)
if casted == nil then
error(("Value \"%s\" is not correct type. Expected %s."):format(argValue, argType), 2)
end
values[i] = casted
end
argument.fun(table.unpack(values))
return true
end
--[[ function argumenthelper.debugList()
for key, _ in pairs(arguments) do
term.write(key..",")
end
print()
end ]]