comparison 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
comparison
equal deleted inserted replaced
13729:b50eadfddd57 13731:d78e0f422464
1 local function parse(arg, config) 1 local function parse(arg, config)
2 local short_params = config and config.short_params or {}; 2 local short_params = config and config.short_params or {};
3 local value_params = config and config.value_params or {}; 3 local value_params = config and config.value_params or {};
4 local array_params = config and config.array_params or {}; 4 local array_params = config and config.array_params or {};
5 local stop_on_positional = not config or config.stop_on_positional ~= false;
5 6
6 local parsed_opts = {}; 7 local parsed_opts = {};
7 8
8 if #arg == 0 then 9 if #arg == 0 then
9 return parsed_opts; 10 return parsed_opts;
13 if not raw_param then 14 if not raw_param then
14 break; 15 break;
15 end 16 end
16 17
17 local prefix = raw_param:match("^%-%-?"); 18 local prefix = raw_param:match("^%-%-?");
18 if not prefix then 19 if not prefix and stop_on_positional then
19 break; 20 break;
20 elseif prefix == "--" and raw_param == "--" then 21 elseif prefix == "--" and raw_param == "--" then
21 table.remove(arg, 1); 22 table.remove(arg, 1);
22 break; 23 break;
23 end 24 end
24 local param = table.remove(arg, 1):sub(#prefix+1);
25 if #param == 1 and short_params then
26 param = short_params[param];
27 end
28 25
29 if not param then 26 if prefix then
30 return nil, "param-not-found", raw_param; 27 local param = table.remove(arg, 1):sub(#prefix+1);
31 end 28 if #param == 1 and short_params then
29 param = short_params[param];
30 end
32 31
33 local param_k, param_v; 32 if not param then
34 if value_params[param] or array_params[param] then 33 return nil, "param-not-found", raw_param;
35 param_k, param_v = param, table.remove(arg, 1);
36 if not param_v then
37 return nil, "missing-value", raw_param;
38 end 34 end
39 else 35
40 param_k, param_v = param:match("^([^=]+)=(.+)$"); 36 local param_k, param_v;
41 if not param_k then 37 if value_params[param] or array_params[param] then
42 if param:match("^no%-") then 38 param_k, param_v = param, table.remove(arg, 1);
43 param_k, param_v = param:sub(4), false; 39 if not param_v then
40 return nil, "missing-value", raw_param;
41 end
42 else
43 param_k, param_v = param:match("^([^=]+)=(.+)$");
44 if not param_k then
45 if param:match("^no%-") then
46 param_k, param_v = param:sub(4), false;
47 else
48 param_k, param_v = param, true;
49 end
50 end
51 param_k = param_k:gsub("%-", "_");
52 end
53 if array_params[param] then
54 if parsed_opts[param_k] then
55 table.insert(parsed_opts[param_k], param_v);
44 else 56 else
45 param_k, param_v = param, true; 57 parsed_opts[param_k] = { param_v };
46 end 58 end
59 else
60 parsed_opts[param_k] = param_v;
47 end 61 end
48 param_k = param_k:gsub("%-", "_"); 62 elseif not stop_on_positional then
49 end 63 table.insert(parsed_opts, table.remove(arg, 1));
50 if array_params[param] then
51 if parsed_opts[param_k] then
52 table.insert(parsed_opts[param_k], param_v);
53 else
54 parsed_opts[param_k] = { param_v };
55 end
56 else
57 parsed_opts[param_k] = param_v;
58 end 64 end
59 end 65 end
60 for i = 1, #arg do 66
61 parsed_opts[i] = arg[i]; 67 if stop_on_positional then
68 for i = 1, #arg do
69 parsed_opts[i] = arg[i];
70 end
62 end 71 end
72
63 return parsed_opts; 73 return parsed_opts;
64 end 74 end
65 75
66 return { 76 return {
67 parse = parse; 77 parse = parse;