diff options
Diffstat (limited to 'core/configmanager.lua')
-rw-r--r-- | core/configmanager.lua | 121 |
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 |