Software /
code /
prosody
Annotate
util/argparse.lua @ 11132:287d0d80aa57
util.prosodyctl: Construct luarocks command line with templates
More flexible and safer wrt escaping
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Mon, 05 Oct 2020 21:13:23 +0200 |
parent | 10936:d770435f0f84 |
child | 11846:6425dfa3de45 |
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 {}; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
4 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 local parsed_opts = {}; |
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 if #arg == 0 then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
8 return parsed_opts; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
9 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 while true do |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 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
|
12 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
|
13 break; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
15 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 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
|
17 if not prefix then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
18 break; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
19 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
|
20 table.remove(arg, 1); |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
21 break; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
22 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
23 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
|
24 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
|
25 param = short_params[param]; |
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 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
28 if not param then |
10936
d770435f0f84
util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents:
10651
diff
changeset
|
29 return nil, "param-not-found", param; |
10651
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
31 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
32 local param_k, param_v; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
33 if value_params[param] then |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
34 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
|
35 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
|
36 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
|
37 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
38 else |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
39 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
|
40 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
|
41 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
|
42 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
|
43 else |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
44 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
|
45 end |
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 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
48 parsed_opts[param_k] = param_v; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
50 return parsed_opts; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 end |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
52 |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 return { |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
54 parse = parse; |
1196f1e8d178
util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
55 } |