From e19909198725b6c338dcb2d6714849505faafefc Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 19 Feb 2020 21:38:00 +0100 Subject: util.startup: Break out command line argument parsing into util.argparse This will allow using it from other places such as prosodyctl sub-commands and plugins --- util/argparse.lua | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 util/argparse.lua (limited to 'util/argparse.lua') diff --git a/util/argparse.lua b/util/argparse.lua new file mode 100644 index 00000000..928fc3eb --- /dev/null +++ b/util/argparse.lua @@ -0,0 +1,58 @@ +local function parse(arg, config) + local short_params = config and config.short_params or {}; + local value_params = config and config.value_params or {}; + + local parsed_opts = {}; + + if #arg == 0 then + return parsed_opts; + end + while true do + local raw_param = arg[1]; + if not raw_param then + break; + end + + local prefix = raw_param:match("^%-%-?"); + if not prefix then + break; + elseif prefix == "--" and raw_param == "--" then + table.remove(arg, 1); + break; + end + local param = table.remove(arg, 1):sub(#prefix+1); + if #param == 1 and short_params then + param = short_params[param]; + end + + if not param then + print("Unknown command-line option: "..tostring(param)); + print("Perhaps you meant to use prosodyctl instead?"); + os.exit(1); + end + + local param_k, param_v; + if value_params[param] then + param_k, param_v = param, table.remove(arg, 1); + if not param_v then + print("Expected a value to follow command-line option: "..raw_param); + os.exit(1); + end + else + param_k, param_v = param:match("^([^=]+)=(.+)$"); + if not param_k then + if param:match("^no%-") then + param_k, param_v = param:sub(4), false; + else + param_k, param_v = param, true; + end + end + end + parsed_opts[param_k] = param_v; + end + return parsed_opts; +end + +return { + parse = parse; +} -- cgit v1.2.3 From 2b2f9903ae4f06f8da960379db80540922879653 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Wed, 17 Jun 2020 19:32:12 +0200 Subject: util.argparse: Move exiting and error to util.startup It's not so nice to have a library that exits the entire application from under you, so this and the error reporting belongs in util.startup. The argparse code was originally in util.startup but moved out in 1196f1e8d178 but the error handling should have stayed. --- util/argparse.lua | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'util/argparse.lua') diff --git a/util/argparse.lua b/util/argparse.lua index 928fc3eb..dde4fcc3 100644 --- a/util/argparse.lua +++ b/util/argparse.lua @@ -26,17 +26,14 @@ local function parse(arg, config) end if not param then - print("Unknown command-line option: "..tostring(param)); - print("Perhaps you meant to use prosodyctl instead?"); - os.exit(1); + return nil, "param-not-found", param; end local param_k, param_v; if value_params[param] then param_k, param_v = param, table.remove(arg, 1); if not param_v then - print("Expected a value to follow command-line option: "..raw_param); - os.exit(1); + return nil, "missing-value", raw_param; end else param_k, param_v = param:match("^([^=]+)=(.+)$"); -- cgit v1.2.3