mirror of
https://github.com/bjc/prosody.git
synced 2025-04-03 05:07:42 +03:00
util.argparse: Optionally continue processing past positional parameters
This commit is contained in:
parent
b8e4d5e840
commit
edafb195e1
1 changed files with 42 additions and 32 deletions
|
@ -2,6 +2,7 @@ local function parse(arg, config)
|
|||
local short_params = config and config.short_params or {};
|
||||
local value_params = config and config.value_params or {};
|
||||
local array_params = config and config.array_params or {};
|
||||
local stop_on_positional = not config or config.stop_on_positional ~= false;
|
||||
|
||||
local parsed_opts = {};
|
||||
|
||||
|
@ -15,51 +16,60 @@ local function parse(arg, config)
|
|||
end
|
||||
|
||||
local prefix = raw_param:match("^%-%-?");
|
||||
if not prefix then
|
||||
if not prefix and stop_on_positional then
|
||||
break;
|
||||
elseif prefix == "--" and raw_param == "--" then
|
||||
table.remove(arg, 1);
|
||||
break;
|
||||
end
|
||||
local param = table.remove(arg, 1):sub(#prefix+1);
|
||||
if #param == 1 and short_params then
|
||||
param = short_params[param];
|
||||
end
|
||||
|
||||
if not param then
|
||||
return nil, "param-not-found", raw_param;
|
||||
end
|
||||
|
||||
local param_k, param_v;
|
||||
if value_params[param] or array_params[param] then
|
||||
param_k, param_v = param, table.remove(arg, 1);
|
||||
if not param_v then
|
||||
return nil, "missing-value", raw_param;
|
||||
if prefix then
|
||||
local param = table.remove(arg, 1):sub(#prefix+1);
|
||||
if #param == 1 and short_params then
|
||||
param = short_params[param];
|
||||
end
|
||||
else
|
||||
param_k, param_v = param:match("^([^=]+)=(.+)$");
|
||||
if not param_k then
|
||||
if param:match("^no%-") then
|
||||
param_k, param_v = param:sub(4), false;
|
||||
else
|
||||
param_k, param_v = param, true;
|
||||
|
||||
if not param then
|
||||
return nil, "param-not-found", raw_param;
|
||||
end
|
||||
|
||||
local param_k, param_v;
|
||||
if value_params[param] or array_params[param] then
|
||||
param_k, param_v = param, table.remove(arg, 1);
|
||||
if not param_v then
|
||||
return nil, "missing-value", raw_param;
|
||||
end
|
||||
end
|
||||
param_k = param_k:gsub("%-", "_");
|
||||
end
|
||||
if array_params[param] then
|
||||
if parsed_opts[param_k] then
|
||||
table.insert(parsed_opts[param_k], param_v);
|
||||
else
|
||||
parsed_opts[param_k] = { param_v };
|
||||
param_k, param_v = param:match("^([^=]+)=(.+)$");
|
||||
if not param_k then
|
||||
if param:match("^no%-") then
|
||||
param_k, param_v = param:sub(4), false;
|
||||
else
|
||||
param_k, param_v = param, true;
|
||||
end
|
||||
end
|
||||
param_k = param_k:gsub("%-", "_");
|
||||
end
|
||||
else
|
||||
parsed_opts[param_k] = param_v;
|
||||
if array_params[param] then
|
||||
if parsed_opts[param_k] then
|
||||
table.insert(parsed_opts[param_k], param_v);
|
||||
else
|
||||
parsed_opts[param_k] = { param_v };
|
||||
end
|
||||
else
|
||||
parsed_opts[param_k] = param_v;
|
||||
end
|
||||
elseif not stop_on_positional then
|
||||
table.insert(parsed_opts, table.remove(arg, 1));
|
||||
end
|
||||
end
|
||||
for i = 1, #arg do
|
||||
parsed_opts[i] = arg[i];
|
||||
|
||||
if stop_on_positional then
|
||||
for i = 1, #arg do
|
||||
parsed_opts[i] = arg[i];
|
||||
end
|
||||
end
|
||||
|
||||
return parsed_opts;
|
||||
end
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue