Software /
code /
prosody
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 |
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 } |