Software /
code /
prosody
Annotate
util/argparse.lua @ 13211:4d4f9e42bcf8
moduleapi: Add :get_option_integer()
Many options in Prosody that are treated as numbers don't make sense as
floats, e.g. sizes and limits measured in bytes.
Simplified implementation based on an earlier attempt dating back to 2020
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 17 Jul 2023 00:09:41 +0200 |
parent | 13160:4ee9a912ceea |
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 {}; |
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
6 local parsed_opts = {}; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
7 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 if #arg == 0 then |
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
9 return parsed_opts; |
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 while true do |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
12 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
|
13 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
|
14 break; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 local prefix = raw_param:match("^%-%-?"); |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 if not prefix then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 break; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 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
|
21 table.remove(arg, 1); |
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 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
24 local param = table.remove(arg, 1):sub(#prefix+1); |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
25 if #param == 1 and short_params then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
26 param = short_params[param]; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
27 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
29 if not param then |
11846 | 30 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
|
31 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 local param_k, param_v; |
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
34 if value_params[param] or array_params[param] then |
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
35 param_k, param_v = param, table.remove(arg, 1); |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
36 if not param_v then |
10936
d770435f0f84
util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents:
10651
diff
changeset
|
37 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
|
38 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 else |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
40 param_k, param_v = param:match("^([^=]+)=(.+)$"); |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
41 if not param_k then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
42 if param:match("^no%-") then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
43 param_k, param_v = param:sub(4), false; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 else |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 param_k, param_v = param, true; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
46 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
47 end |
13058
766152afc1c9
util.argparse: Translate '-' to '_' in long option names for convenience
Matthew Wild <mwild1@gmail.com>
parents:
12477
diff
changeset
|
48 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
|
49 end |
13160
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
50 if array_params[param] then |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
51 if parsed_opts[param_k] then |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
52 table.insert(parsed_opts[param_k], param_v); |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
53 else |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
54 parsed_opts[param_k] = { param_v }; |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
55 end |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
56 else |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
diff
changeset
|
57 parsed_opts[param_k] = param_v; |
4ee9a912ceea
util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents:
13058
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 |
12477
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
60 for i = 1, #arg do |
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
61 parsed_opts[i] = arg[i]; |
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
62 end |
cc84682b8429
util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents:
12475
diff
changeset
|
63 return parsed_opts; |
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
64 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
65 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
66 return { |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
67 parse = parse; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
68 } |