diff options
author | Kim Alvefur <zash@zash.se> | 2020-02-19 21:38:00 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2020-02-19 21:38:00 +0100 |
commit | e19909198725b6c338dcb2d6714849505faafefc (patch) | |
tree | 26cd120985497268e2e83bff10df374c4313d18a /util/argparse.lua | |
parent | dce92c437ae10cc79abacc7960482065299fd230 (diff) | |
download | prosody-e19909198725b6c338dcb2d6714849505faafefc.tar.gz prosody-e19909198725b6c338dcb2d6714849505faafefc.zip |
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
Diffstat (limited to 'util/argparse.lua')
-rw-r--r-- | util/argparse.lua | 58 |
1 files changed, 58 insertions, 0 deletions
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; +} |