Mercurial > prosody-hg
annotate util/argparse.lua @ 13946:f5e8ab42c708
mod_http_file_share: Check that files are still there with correct size
Failed uploads can leave behind unused slots. Files shouldn't change
size after they have been successfully uploaded, but might as well
double check it.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 04 Dec 2021 18:56:51 +0100 |
| parents | aac30c5ee334 |
| children |
| 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 {}; |
|
13898
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
5 local bool_params = config and (config.bool_params or config.kv_params) or {}; -- COMPAT: kv_params in 13.0 and earlier |
|
13733
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 |
|
13898
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
51 if param:match("^no%-") then |
|
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
52 param_k, param_v = param:sub(4), false; |
|
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
53 else |
|
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
54 param_k, param_v = param, true; |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
55 end |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
56 param_k = param_k:gsub("%-", "_"); |
|
13898
aac30c5ee334
util.argparse: Rename kv_params to bool_params, remove support for arbitrary values
Matthew Wild <mwild1@gmail.com>
parents:
13762
diff
changeset
|
57 if strict and not bool_params[param_k] then |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
58 return nil, "param-not-found", raw_param; |
|
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
59 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
60 end |
|
13733
48c056c10e5a
util.argparse: Add strict mode + tests
Matthew Wild <mwild1@gmail.com>
parents:
13731
diff
changeset
|
61 if array_params[uparam] then |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
62 if parsed_opts[param_k] then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
63 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
|
64 else |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
65 parsed_opts[param_k] = { param_v }; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
66 end |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
67 else |
|
13731
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; |
|
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
69 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
70 elseif not stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
71 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
|
72 end |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
74 |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
75 if stop_on_positional then |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
76 for i = 1, #arg do |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
77 parsed_opts[i] = arg[i]; |
|
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
78 end |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
79 end |
|
13731
d78e0f422464
util.argparse: Optionally continue processing past positional parameters
Matthew Wild <mwild1@gmail.com>
parents:
13160
diff
changeset
|
80 |
|
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
81 return parsed_opts; |
|
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
82 end |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
83 |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
84 return { |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
85 parse = parse; |
|
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
86 } |
