util/argparse.lua
author Kim Alvefur <zash@zash.se>
Wed, 27 Mar 2024 19:33:11 +0100
changeset 13471 c2a476f4712a
parent 13164 4ee9a912ceea
permissions -rw-r--r--
util.startup: Fix exiting on pidfile trouble prosody.shutdown() relies on prosody.main_thread, which has not been set yet at this point. Doing a clean shutdown might actually be harmful in case it tears down things set up by the conflicting Prosody, such as the very pidfile we were looking at. Thanks again SigmaTel71 for noticing
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
local function parse(arg, config)
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
	local short_params = config and config.short_params or {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
	local value_params = config and config.value_params or {};
13164
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
     4
	local array_params = config and config.array_params or {};
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
	local parsed_opts = {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
	if #arg == 0 then
12481
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12479
diff changeset
     9
		return parsed_opts;
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
	end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
	while true do
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
		local raw_param = arg[1];
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
		if not raw_param then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
		local prefix = raw_param:match("^%-%-?");
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
		if not prefix then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
		elseif prefix == "--" and raw_param == "--" then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
			table.remove(arg, 1);
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
		local param = table.remove(arg, 1):sub(#prefix+1);
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
		if #param == 1 and short_params then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
			param = short_params[param];
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		if not param then
11850
6425dfa3de45 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 10940
diff changeset
    30
			return nil, "param-not-found", raw_param;
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		local param_k, param_v;
13164
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    34
		if value_params[param] or array_params[param] then
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
			param_k, param_v = param, table.remove(arg, 1);
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    36
			if not param_v then
10940
d770435f0f84 util.argparse: Move exiting and error to util.startup
Kim Alvefur <zash@zash.se>
parents: 10655
diff changeset
    37
				return nil, "missing-value", raw_param;
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
			end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		else
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
			param_k, param_v = param:match("^([^=]+)=(.+)$");
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
			if not param_k then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
				if param:match("^no%-") then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
					param_k, param_v = param:sub(4), false;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
				else
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
					param_k, param_v = param, true;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
				end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
			end
13062
766152afc1c9 util.argparse: Translate '-' to '_' in long option names for convenience
Matthew Wild <mwild1@gmail.com>
parents: 12481
diff changeset
    48
			param_k = param_k:gsub("%-", "_");
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
		end
13164
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    50
		if array_params[param] then
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    51
			if parsed_opts[param_k] then
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    52
				table.insert(parsed_opts[param_k], param_v);
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    53
			else
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    54
				parsed_opts[param_k] = { param_v };
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    55
			end
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    56
		else
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    57
			parsed_opts[param_k] = param_v;
4ee9a912ceea util.argparse: Add support for repeatable parameters
Kim Alvefur <zash@zash.se>
parents: 13062
diff changeset
    58
		end
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
	end
12481
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12479
diff changeset
    60
	for i = 1, #arg do
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12479
diff changeset
    61
		parsed_opts[i] = arg[i];
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12479
diff changeset
    62
	end
cc84682b8429 util.argparse: Revise 553c6204fe5b with a different approach
Matthew Wild <mwild1@gmail.com>
parents: 12479
diff changeset
    63
	return parsed_opts;
10655
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    64
end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    65
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    66
return {
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    67
	parse = parse;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    68
}