util.argparse: Add support for repeatable parameters
authorKim Alvefur <zash@zash.se>
Wed, 05 Jan 2022 04:46:27 +0100
changeset 13164 4ee9a912ceea
parent 13163 706f7d1affc2
child 13165 9ba11ef91ce4
util.argparse: Add support for repeatable parameters These are gathered into arrays
spec/util_argparse_spec.lua
util/argparse.lua
--- a/spec/util_argparse_spec.lua	Sat Jun 17 13:37:33 2023 +0200
+++ b/spec/util_argparse_spec.lua	Wed Jan 05 04:46:27 2022 +0100
@@ -50,4 +50,9 @@
 		assert.equal("-h", where, "returned where");
 	end);
 
+	it("supports array arguments", function ()
+		local opts, err = parse({ "--item"; "foo"; "--item"; "bar" }, { array_params = { item = true } });
+		assert.falsy(err);
+		assert.same({"foo","bar"}, opts.item);
+	end)
 end);
--- a/util/argparse.lua	Sat Jun 17 13:37:33 2023 +0200
+++ b/util/argparse.lua	Wed Jan 05 04:46:27 2022 +0100
@@ -1,6 +1,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 parsed_opts = {};
 
@@ -30,7 +31,7 @@
 		end
 
 		local param_k, param_v;
-		if value_params[param] then
+		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;
@@ -46,7 +47,15 @@
 			end
 			param_k = param_k:gsub("%-", "_");
 		end
-		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
 	end
 	for i = 1, #arg do
 		parsed_opts[i] = arg[i];