Software / code / prosody
Annotate
util/argparse.lua @ 13829:dde0ce03049b 13.0
modulemanager, util.pluginloader: Improve error message when load fails but some candidates were filtered
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Wed, 09 Apr 2025 10:53:37 +0100 |
| parent | 13762:81856814d74f |
| 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 |
|
13762
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
42 param_k = uparam; |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
43 param_v = param:match("^=(.*)$", #uparam+1); |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
44 if not param_v then |
|
13762
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
45 param_v = table.remove(arg, 1); |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
46 if not param_v then |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
47 return nil, "missing-value", raw_param; |
|
81856814d74f
util.argparse: Fix bug (regression?) in argument parsing with --foo=bar
Matthew Wild <mwild1@gmail.com>
parents:
13733
diff
changeset
|
48 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
50 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
51 param_k, param_v = param:match("^([^=]+)=(.+)$"); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
52 if not param_k then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
53 if param:match("^no%-") then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
54 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
|
55 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
56 param_k, param_v = param, true; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
57 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
58 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
59 param_k = param_k:gsub("%-", "_"); |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
60 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
|
61 return nil, "param-not-found", raw_param; |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
62 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 end |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
64 if array_params[uparam] then |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
65 if parsed_opts[param_k] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
66 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
|
67 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
68 parsed_opts[param_k] = { param_v }; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
69 end |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
70 else |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
71 parsed_opts[param_k] = param_v; |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
72 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
73 elseif not stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
74 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
|
75 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
77 |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
78 if stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
79 for i = 1, #arg do |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
80 parsed_opts[i] = arg[i]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
81 end |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
82 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
83 |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
84 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
87 return { |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
88 parse = parse; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
89 } |