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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }