File

util/argparse.lua @ 11717:605484fc1c62

mod_pubsub: Normalize 'publisher' JID All the XEP-0060 examples have the publisher attribute set to a bare JID, but the text does allow it to be the full JID. Since mod_pubsub is more likely used for open nodes that anyone can subscribe to it makes sense to not leak the full JIDs. This is also disabled by defaults. In mod_pep on the other hand it might make sense to have the full JID since that data is more likely to be broadcast to contacts which are already somewhat trusted.
author Kim Alvefur <zash@zash.se>
date Sun, 25 Jul 2021 14:01:45 +0200
parent 10936:d770435f0f84
child 11846:6425dfa3de45
line wrap: on
line source

local function parse(arg, config)
	local short_params = config and config.short_params or {};
	local value_params = config and config.value_params or {};

	local parsed_opts = {};

	if #arg == 0 then
		return parsed_opts;
	end
	while true do
		local raw_param = arg[1];
		if not raw_param then
			break;
		end

		local prefix = raw_param:match("^%-%-?");
		if not prefix 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", param;
		end

		local param_k, param_v;
		if value_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
		end
		parsed_opts[param_k] = param_v;
	end
	return parsed_opts;
end

return {
	parse = parse;
}