util/argparse.lua
author Kim Alvefur <zash@zash.se>
Mon, 07 Mar 2022 00:35:29 +0100
changeset 12392 50fcd3879482
parent 11850 6425dfa3de45
child 12479 553c6204fe5b
permissions -rw-r--r--
spelling: non-existing mistakes (thanks timeless)
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 {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
	local parsed_opts = {};
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
	if #arg == 0 then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
		return parsed_opts;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
	end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
	while true do
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
		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
    12
		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
    13
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
		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
    17
		if not prefix then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
		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
    20
			table.remove(arg, 1);
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    21
			break;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    22
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
		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
    24
		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
    25
			param = short_params[param];
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
		if not param then
11850
6425dfa3de45 Merge 0.11->trunk
Kim Alvefur <zash@zash.se>
parents: 10940
diff changeset
    29
			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
    30
		end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
		local param_k, param_v;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		if value_params[param] then
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
			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
    35
			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
    36
				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
    37
			end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		else
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
			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
    40
			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
    41
				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
    42
					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
    43
				else
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
					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
    45
				end
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
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
		parsed_opts[param_k] = param_v;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
	end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
	return parsed_opts;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
end
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
return {
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
	parse = parse;
1196f1e8d178 util.startup: Break out command line argument parsing into util.argparse
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
}