Comparison

util/argparse.lua @ 10651:1196f1e8d178

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
author Kim Alvefur <zash@zash.se>
date Wed, 19 Feb 2020 21:38:00 +0100
child 10936:d770435f0f84
comparison
equal deleted inserted replaced
10650:324a0c7d1c6a 10651:1196f1e8d178
1 local function parse(arg, config)
2 local short_params = config and config.short_params or {};
3 local value_params = config and config.value_params or {};
4
5 local parsed_opts = {};
6
7 if #arg == 0 then
8 return parsed_opts;
9 end
10 while true do
11 local raw_param = arg[1];
12 if not raw_param then
13 break;
14 end
15
16 local prefix = raw_param:match("^%-%-?");
17 if not prefix then
18 break;
19 elseif prefix == "--" and raw_param == "--" then
20 table.remove(arg, 1);
21 break;
22 end
23 local param = table.remove(arg, 1):sub(#prefix+1);
24 if #param == 1 and short_params then
25 param = short_params[param];
26 end
27
28 if not param then
29 print("Unknown command-line option: "..tostring(param));
30 print("Perhaps you meant to use prosodyctl instead?");
31 os.exit(1);
32 end
33
34 local param_k, param_v;
35 if value_params[param] then
36 param_k, param_v = param, table.remove(arg, 1);
37 if not param_v then
38 print("Expected a value to follow command-line option: "..raw_param);
39 os.exit(1);
40 end
41 else
42 param_k, param_v = param:match("^([^=]+)=(.+)$");
43 if not param_k then
44 if param:match("^no%-") then
45 param_k, param_v = param:sub(4), false;
46 else
47 param_k, param_v = param, true;
48 end
49 end
50 end
51 parsed_opts[param_k] = param_v;
52 end
53 return parsed_opts;
54 end
55
56 return {
57 parse = parse;
58 }