aboutsummaryrefslogtreecommitdiffstats
path: root/core/configmanager.lua
diff options
context:
space:
mode:
Diffstat (limited to 'core/configmanager.lua')
-rw-r--r--core/configmanager.lua121
1 files changed, 121 insertions, 0 deletions
diff --git a/core/configmanager.lua b/core/configmanager.lua
new file mode 100644
index 00000000..5f5648b9
--- /dev/null
+++ b/core/configmanager.lua
@@ -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