core/moduleapi.lua
changeset 13216 3e6e98cc63e9
parent 13215 4d4f9e42bcf8
child 13219 b1c2e70de470
--- a/core/moduleapi.lua	Mon Jul 17 00:09:41 2023 +0200
+++ b/core/moduleapi.lua	Mon Jul 17 00:37:44 2023 +0200
@@ -268,27 +268,43 @@
 	return value;
 end
 
-function api:get_option_period(name, default_value)
+function api:get_option_period(name, default_value, min, max)
 	local value = self:get_option_scalar(name, default_value);
-	if type(value) == "number" then
-		if value < 0 then
-			self:log("debug", "Treating negative period as infinity");
-			return math.huge;
-		end
-		-- assume seconds
-		return value;
-	elseif value == "never" or value == false then
+
+	local ret;
+	if value == "never" or value == false then
 		-- usually for disabling some periodic thing
 		return math.huge;
+	elseif type(value) == "number" then
+		-- assume seconds
+		ret = value;
 	elseif type(value) == "string" then
-		local ret = human_io.parse_duration(value);
+		ret = human_io.parse_duration(value);
 		if value ~= nil and ret == nil then
 			self:log("error", "Config option '%s' not understood, expecting a period (e.g. \"2 days\")", name);
 		end
-		return ret;
 	elseif value ~= nil then
 		self:log("error", "Config option '%s' expects a number or a period description string (e.g. \"3 hours\"), not %s", name, type(value));
+		return nil;
+	else
+		return nil;
 	end
+
+	if ret < 0 then
+		self:log("debug", "Treating negative period as infinity");
+		return math.huge;
+	end
+
+	if min and ret < min then
+		self:log("warn", "Config option '%s' out of bounds %g < %g", name, ret, min);
+		return min;
+	end
+	if max and ret > max then
+		self:log("warn", "Config option '%s' out of bounds %g > %g", name, ret, max);
+		return max;
+	end
+
+	return ret;
 end
 
 function api:get_option_boolean(name, ...)