aboutsummaryrefslogtreecommitdiffstats
path: root/util/argparse.lua
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2020-09-30 09:50:33 +0100
committerMatthew Wild <mwild1@gmail.com>2020-09-30 09:50:33 +0100
commitbf6c2db68257e8ac3a35e2c4e7c18b55313a5bf7 (patch)
tree3a37db7b805b1555d08cc61c7938cf512ff35ce0 /util/argparse.lua
parent2940b9c66f4a053dbe2ca038468a3a8791beccd5 (diff)
parentbd3bd2179be360f86c7db3fcd400dbb168fa8be5 (diff)
downloadprosody-bf6c2db68257e8ac3a35e2c4e7c18b55313a5bf7.tar.gz
prosody-bf6c2db68257e8ac3a35e2c4e7c18b55313a5bf7.zip
Merge 0.11->trunk
Diffstat (limited to 'util/argparse.lua')
-rw-r--r--util/argparse.lua55
1 files changed, 55 insertions, 0 deletions
diff --git a/util/argparse.lua b/util/argparse.lua
new file mode 100644
index 00000000..dde4fcc3
--- /dev/null
+++ b/util/argparse.lua
@@ -0,0 +1,55 @@
+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
+ 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
+ return nil, "missing-value", raw_param;
+ 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;
+}