Mercurial > prosody-hg
annotate util/argparse.lua @ 13731:d78e0f422464 13.0
util.argparse: Optionally continue processing past positional parameters
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Mon, 17 Feb 2025 16:38:48 +0000 |
| parents | 4ee9a912ceea |
| children | 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 {}; |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
5 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
|
6 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 local parsed_opts = {}; |
|
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 if #arg == 0 then |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
10 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 while true do |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
13 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
|
14 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
|
15 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 local prefix = raw_param:match("^%-%-?"); |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
19 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
|
20 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 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
|
22 table.remove(arg, 1); |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 break; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
26 if prefix then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
27 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
|
28 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
|
29 param = short_params[param]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
30 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
32 if not param then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
33 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
|
34 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
35 |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
36 local param_k, param_v; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
37 if value_params[param] or array_params[param] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
38 param_k, param_v = param, table.remove(arg, 1); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
39 if not param_v then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
40 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
|
41 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
42 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
43 param_k, param_v = param:match("^([^=]+)=(.+)$"); |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
44 if not param_k then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
45 if param:match("^no%-") then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
46 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
|
47 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
48 param_k, param_v = param, true; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
49 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
50 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
51 param_k = param_k:gsub("%-", "_"); |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
53 if array_params[param] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
54 if parsed_opts[param_k] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
55 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
|
56 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
57 parsed_opts[param_k] = { param_v }; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
58 end |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
59 else |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
60 parsed_opts[param_k] = param_v; |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
61 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
62 elseif not stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
63 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
|
64 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
66 |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
67 if stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
68 for i = 1, #arg do |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
69 parsed_opts[i] = arg[i]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
70 end |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
71 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
72 |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
73 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
74 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
75 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
76 return { |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
77 parse = parse; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 } |
