Diff

core/configmanager.lua @ 403:da92afa267cf

Merging with main branch.
author Tobias Markmann <tm@ayena.de>
date Sun, 23 Nov 2008 20:44:48 +0100
parent 376:6d87944df37c
child 466:0ecfd89c2cc0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/configmanager.lua	Sun Nov 23 20:44:48 2008 +0100
@@ -0,0 +1,121 @@
+
+local _G = _G;
+local 	setmetatable, loadfile, pcall, rawget, rawset, io = 
+		setmetatable, loadfile, pcall, rawget, rawset, io;
+module "configmanager"
+
+local parsers = {};
+
+local config = { ["*"] = { core = {} } };
+
+local global_config = config["*"];
+
+-- When host not found, use global
+setmetatable(config, { __index = function () return global_config; end});
+local host_mt = { __index = global_config };
+
+-- When key not found in section, check key in global's section
+function section_mt(section_name)
+	return { __index = 	function (t, k)
+									local section = rawget(global_config, section_name);
+									if not section then return nil; end
+									return section[k];
+							end };
+end
+
+function getconfig()
+	return config;
+end
+
+function get(host, section, key)
+	local sec = config[host][section];
+	if sec then
+		return sec[key];
+	end
+	return nil;
+end
+
+function set(host, section, key, value)
+	if host and section and key then
+		local hostconfig = rawget(config, host);
+		if not hostconfig then
+			hostconfig = rawset(config, host, setmetatable({}, host_mt))[host];
+		end
+		if not rawget(hostconfig, section) then
+			hostconfig[section] = setmetatable({}, section_mt(section));
+		end
+		hostconfig[section][key] = value;
+		return true;
+	end
+	return false;
+end
+
+function load(filename, format)
+	format = format or filename:match("%w+$");
+	if parsers[format] and parsers[format].load then
+		local f = io.open(filename);
+		if f then 
+			local ok, err = parsers[format].load(f:read("*a"));
+			f:close();
+			return ok, err;
+		end
+	end
+	if not format then
+		return nil, "no parser specified";
+	else
+		return false, "no parser";
+	end
+end
+
+function save(filename, format)
+end
+
+function addparser(format, parser)
+	if format and parser then
+		parsers[format] = parser;
+	end
+end
+
+-- Built-in Lua parser
+do
+	local loadstring, pcall, setmetatable = _G.loadstring, _G.pcall, _G.setmetatable;
+	local setfenv, rawget, tostring = _G.setfenv, _G.rawget, _G.tostring;
+	parsers.lua = {};
+	function parsers.lua.load(data)
+		local env;
+		env = setmetatable({ Host = true; host = true; }, { __index = function (t, k)
+												return rawget(_G, k) or
+														function (settings_table)
+															config[__currenthost or "*"][k] = settings_table;
+														end;
+										end,
+								__newindex = function (t, k, v)
+											set(env.__currenthost or "*", "core", k, v);
+										end});
+		
+		function env.Host(name)
+			rawset(env, "__currenthost", name);
+			set(name or "*", "core", "defined", true);
+		end
+		env.host = env.Host;
+		
+		local chunk, err = loadstring(data);
+		
+		if not chunk then
+			return nil, err;
+		end
+		
+		setfenv(chunk, env);
+		
+		local ok, err = pcall(chunk);
+		
+		if not ok then
+			return nil, err;
+		end
+		
+		return true;
+	end
+	
+end
+
+return _M;
\ No newline at end of file