Annotate

util/argparse.lua @ 13741:e9edf9b50f32 13.0

mod_invites: Hide --group flag unless mod_invites_groups is enabled The WIP groups support is not complete yet, and won't work without extra modules (which are not yet a part of Prosody). For now we hide --group support unless mod_invites_groups (community module) is specified in modules_enabled.
author Matthew Wild <mwild1@gmail.com>
date Mon, 17 Feb 2025 23:06:06 +0000
parent 13733:48c056c10e5a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local function parse(arg, config)
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 local short_params = config and config.short_params or {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local value_params = config and config.value_params or {};
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13058
diff changeset
4 local array_params = config and config.array_params or {};
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
5 local kv_params = config and config.kv_params or {};
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
6 local strict = config and config.strict;
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
7 local stop_on_positional = not config or config.stop_on_positional ~= false;
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 local parsed_opts = {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 if #arg == 0 then
12477
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12475
diff changeset
12 return parsed_opts;
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 while true do
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15 local raw_param = arg[1];
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 if not raw_param then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 local prefix = raw_param:match("^%-%-?");
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
21 if not prefix and stop_on_positional then
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 elseif prefix == "--" and raw_param == "--" then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 table.remove(arg, 1);
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
28 if prefix then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
29 local param = table.remove(arg, 1):sub(#prefix+1);
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
30 if #param == 1 and short_params then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
31 param = short_params[param];
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
32 end
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
34 if not param then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
35 return nil, "param-not-found", raw_param;
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 end
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
37
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
38 local uparam = param:match("^[^=]*"):gsub("%-", "_");
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
39
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
40 local param_k, param_v;
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
41 if value_params[uparam] or array_params[uparam] then
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
42 param_k, param_v = uparam, table.remove(arg, 1);
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
43 if not param_v then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
44 return nil, "missing-value", raw_param;
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
45 end
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
46 else
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
47 param_k, param_v = param:match("^([^=]+)=(.+)$");
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
48 if not param_k then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
49 if param:match("^no%-") then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
50 param_k, param_v = param:sub(4), false;
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
51 else
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
52 param_k, param_v = param, true;
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
53 end
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
54 end
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
55 param_k = param_k:gsub("%-", "_");
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
56 if strict and not kv_params[param_k] then
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
57 return nil, "param-not-found", raw_param;
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
58 end
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
59 end
13733
48c056c10e5a util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents: 13731
diff changeset
60 if array_params[uparam] then
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
61 if parsed_opts[param_k] then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
62 table.insert(parsed_opts[param_k], param_v);
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
63 else
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
64 parsed_opts[param_k] = { param_v };
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
65 end
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13058
diff changeset
66 else
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
67 parsed_opts[param_k] = param_v;
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13058
diff changeset
68 end
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
69 elseif not stop_on_positional then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
70 table.insert(parsed_opts, table.remove(arg, 1));
13160
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13058
diff changeset
71 end
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 end
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
73
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
74 if stop_on_positional then
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
75 for i = 1, #arg do
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
76 parsed_opts[i] = arg[i];
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
77 end
12477
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12475
diff changeset
78 end
13731
d78e0f422464 util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents: 13160
diff changeset
79
12477
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12475
diff changeset
80 return parsed_opts;
10651
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
81 end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
82
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
83 return {
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
84 parse = parse;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
85 }