Mercurial > prosody-hg
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; |
