Comparison

core/moduleapi.lua @ 13212:3e6e98cc63e9

core.moduleapi: Add min/max range support to :get_option_period To match :get_option_number etc, specifying the allowed interval. Default is essentially (0, inf].
author Kim Alvefur <zash@zash.se>
date Mon, 17 Jul 2023 00:37:44 +0200
parent 13211:4d4f9e42bcf8
child 13215:b1c2e70de470
comparison
equal deleted inserted replaced
13211:4d4f9e42bcf8 13212:3e6e98cc63e9
266 end 266 end
267 -- nil or an integer 267 -- nil or an integer
268 return value; 268 return value;
269 end 269 end
270 270
271 function api:get_option_period(name, default_value) 271 function api:get_option_period(name, default_value, min, max)
272 local value = self:get_option_scalar(name, default_value); 272 local value = self:get_option_scalar(name, default_value);
273 if type(value) == "number" then 273
274 if value < 0 then 274 local ret;
275 self:log("debug", "Treating negative period as infinity"); 275 if value == "never" or value == false then
276 return math.huge;
277 end
278 -- assume seconds
279 return value;
280 elseif value == "never" or value == false then
281 -- usually for disabling some periodic thing 276 -- usually for disabling some periodic thing
282 return math.huge; 277 return math.huge;
278 elseif type(value) == "number" then
279 -- assume seconds
280 ret = value;
283 elseif type(value) == "string" then 281 elseif type(value) == "string" then
284 local ret = human_io.parse_duration(value); 282 ret = human_io.parse_duration(value);
285 if value ~= nil and ret == nil then 283 if value ~= nil and ret == nil then
286 self:log("error", "Config option '%s' not understood, expecting a period (e.g. \"2 days\")", name); 284 self:log("error", "Config option '%s' not understood, expecting a period (e.g. \"2 days\")", name);
287 end 285 end
288 return ret;
289 elseif value ~= nil then 286 elseif value ~= nil then
290 self:log("error", "Config option '%s' expects a number or a period description string (e.g. \"3 hours\"), not %s", name, type(value)); 287 self:log("error", "Config option '%s' expects a number or a period description string (e.g. \"3 hours\"), not %s", name, type(value));
291 end 288 return nil;
289 else
290 return nil;
291 end
292
293 if ret < 0 then
294 self:log("debug", "Treating negative period as infinity");
295 return math.huge;
296 end
297
298 if min and ret < min then
299 self:log("warn", "Config option '%s' out of bounds %g < %g", name, ret, min);
300 return min;
301 end
302 if max and ret > max then
303 self:log("warn", "Config option '%s' out of bounds %g > %g", name, ret, max);
304 return max;
305 end
306
307 return ret;
292 end 308 end
293 309
294 function api:get_option_boolean(name, ...) 310 function api:get_option_boolean(name, ...)
295 local value = self:get_option_scalar(name, ...); 311 local value = self:get_option_scalar(name, ...);
296 if value == nil then 312 if value == nil then