Changeset

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 13729:b50eadfddd57
children 13732:1465b1e305df
files util/argparse.lua
diffstat 1 files changed, 40 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/util/argparse.lua	Sun Feb 11 13:34:13 2024 +0100
+++ b/util/argparse.lua	Mon Feb 17 16:38:48 2025 +0000
@@ -2,6 +2,7 @@
 	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 @@
 		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
+		if prefix then
+			local param = table.remove(arg, 1):sub(#prefix+1);
+			if #param == 1 and short_params then
+				param = short_params[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 not param then
+				return nil, "param-not-found", raw_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;
+
+			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
+			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;
+					end
+				end
+				param_k = param_k:gsub("%-", "_");
 			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);
+			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 };
+				parsed_opts[param_k] = param_v;
 			end
-		else
-			parsed_opts[param_k] = param_v;
+		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