Comparison

core/configmanager.lua @ 13390:905a6009f60d

configmanager: Support for appending to existing config options ...and some other useful operations
author Matthew Wild <mwild1@gmail.com>
date Fri, 08 Dec 2023 15:34:48 +0000
parent 13389:47d0d80da208
child 13391:5c783cf58ae7
comparison
equal deleted inserted replaced
13389:47d0d80da208 13390:905a6009f60d
11 setmetatable, rawget, rawset, io, os, error, dofile, type, pairs, ipairs; 11 setmetatable, rawget, rawset, io, os, error, dofile, type, pairs, ipairs;
12 local format, math_max, t_insert = string.format, math.max, table.insert; 12 local format, math_max, t_insert = string.format, math.max, table.insert;
13 13
14 local envload = require"prosody.util.envload".envload; 14 local envload = require"prosody.util.envload".envload;
15 local deps = require"prosody.util.dependencies"; 15 local deps = require"prosody.util.dependencies";
16 local it = require"prosody.util.iterators";
16 local resolve_relative_path = require"prosody.util.paths".resolve_relative_path; 17 local resolve_relative_path = require"prosody.util.paths".resolve_relative_path;
17 local glob_to_pattern = require"prosody.util.paths".glob_to_pattern; 18 local glob_to_pattern = require"prosody.util.paths".glob_to_pattern;
18 local path_sep = package.config:sub(1,1); 19 local path_sep = package.config:sub(1,1);
19 local get_traceback_table = require "prosody.util.debug".get_traceback_table; 20 local get_traceback_table = require "prosody.util.debug".get_traceback_table;
20 21
113 if tb[i].info.short_src == config_file then 114 if tb[i].info.short_src == config_file then
114 return tb[i].info.currentline; 115 return tb[i].info.currentline;
115 end 116 end
116 end 117 end
117 end 118 end
119
120 local config_option_proxy_mt = {
121 __index = setmetatable({
122 append = function (self, value)
123 local original_option = self:value();
124 if original_option == nil then
125 original_option = {};
126 end
127 if type(value) ~= "table" then
128 error("'append' operation expects a list of values to append to the existing list", 2);
129 end
130 if value[1] ~= nil then
131 for _, v in ipairs(value) do
132 t_insert(original_option, v);
133 end
134 else
135 for k, v in pairs(value) do
136 original_option[k] = v;
137 end
138 end
139 set(self.config_table, self.host, self.option_name, original_option);
140 return self;
141 end;
142 value = function (self)
143 return rawget_option(self.config_table, self.host, self.option_name);
144 end;
145 values = function (self)
146 return it.values(self:value());
147 end;
148 }, {
149 __index = function (t, k)
150 error("Unknown config option operation: '"..k.."'", 2);
151 end;
152 });
153
154 __call = function (self, v2)
155 local v = self:value() or {};
156 if type(v) == "table" and type(v2) == "table" then
157 return self:append(v2);
158 end
159
160 error("Invalid syntax - missing '=' perhaps?", 2);
161 end;
162 };
163
118 parser = {}; 164 parser = {};
119 function parser.load(data, config_file, config_table) 165 function parser.load(data, config_file, config_table)
120 local set_options = {}; -- set_options[host.."/"..option_name] = true (when the option has been set already in this file) 166 local set_options = {}; -- set_options[host.."/"..option_name] = true (when the option has been set already in this file)
121 local warnings = {}; 167 local warnings = {};
122 local env; 168 local env;
132 if k == "Lua" then 178 if k == "Lua" then
133 return _G; 179 return _G;
134 end 180 end
135 local val = rawget_option(config_table, env.__currenthost or "*", k); 181 local val = rawget_option(config_table, env.__currenthost or "*", k);
136 182
137 if val ~= nil then 183 local g_val = rawget(_G, k);
184
185 if val ~= nil or g_val == nil then
186 if type(val) == "table" then
187 return setmetatable({
188 config_table = config_table;
189 host = env.__currenthost or "*";
190 option_name = k;
191 }, config_option_proxy_mt);
192 end
138 return val; 193 return val;
139 end 194 end
140
141 local g_val = rawget(_G, k);
142 195
143 if g_val ~= nil then 196 if g_val ~= nil then
144 t_insert(warnings, ("%s:%d: direct usage of the Lua API is deprecated - replace `%s` with `Lua.%s`"):format(config_file, get_line_number(config_file), k, k)); 197 t_insert(warnings, ("%s:%d: direct usage of the Lua API is deprecated - replace `%s` with `Lua.%s`"):format(config_file, get_line_number(config_file), k, k));
145 end 198 end
146 199