module std::os::posix @if(env::POSIX);
import std::io, std::os::env;

fn String? xdg_user_dir_lookup(Allocator allocator, String type) => @pool()
{
	String home = env::tget_var("HOME")!;
	String config_file @noinit;
	if (try String config_home = env::tget_var("XDG_CONFIG_HOME") && config_home.len)
	{
		config_file = config_home.tconcat("/user-dirs.dirs");
	}
	else
	{
		config_file = home.tconcat("/.config/user-dirs.dirs");
	}
	File f = file::open(config_file, "r")!;
	defer (void)f.close();
	while (try line = io::treadline(&f))
	{
		line = line.trim();
		if (!line.starts_with("XDG_")) continue;
		line = line[4..];
		if (!line.starts_with(type)) continue;
		line = line[type.len ..];
		if (!line.starts_with("_DIR")) continue;
		line = line[4..];
		line = line.trim();
		if (!line.starts_with("=")) continue;
		line = line[1..].trim();
		if (!line.starts_with("\"")) continue;
		line = line[1..];
		bool relative = false;
		if (line.starts_with("$HOME/"))
		{
			relative = true;
			line = line[6..];
		}
		else
		{
			if (!line.starts_with("/")) continue;
			if (line.len < 2) continue;
			line = line[1..];
		}
		if (line.len < 1 || line[^1] != '"') continue;
		line = line[:^1];
		if (relative)
		{
			return string::format(allocator, "%s/%s", home, line);
		}
		return line.copy(allocator);
	}
	return io::PATH_COULD_NOT_BE_FOUND~;
}