]> git.ipfire.org Git - thirdparty/rspamd.git/commitdiff
[Feature] Add T.callable() type to lua_shape
authorVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 18 Nov 2025 11:09:22 +0000 (11:09 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Tue, 18 Nov 2025 11:09:22 +0000 (11:09 +0000)
Add function/callable type validator to lua_shape core.

Implementation:
- check_callable(): Validates value is of type 'function'
- T.callable(opts): Constructor for callable type
- Returns type_mismatch error if value is not a function

This was missing from the initial implementation and is needed by
lua_meta.lua which validates callback functions in metafunction schemas.

Documentation added to README.md scalar types section.

lualib/lua_shape/README.md
lualib/lua_shape/core.lua

index 32fcf732a8d4d2da2132460e6688ef18dd9949f0..812bed51618f8b1ade44079a01f4fc39fb787476 100644 (file)
@@ -55,6 +55,7 @@ local ok, config = config_schema:transform({
 - `T.number(opts)` - Number with optional range constraints (min, max)
 - `T.integer(opts)` - Integer (number with integer constraint)
 - `T.boolean()` - Boolean value
+- `T.callable()` - Function/callable value
 - `T.enum(values)` - One of a fixed set of values
 - `T.literal(value)` - Exact value match
 
index 977cd9691ee55543fc892a4cbfe00f408120231b..4ee1d32e54863de01fe719d56f62d5bf6e9756e5 100644 (file)
@@ -293,6 +293,25 @@ function T.boolean(opts)
   })
 end
 
+local function check_callable(node, value, ctx)
+  if type(value) ~= "function" then
+    return false, make_error("type_mismatch", ctx.path, {
+      expected = "function",
+      got = type(value)
+    })
+  end
+
+  return true, value
+end
+
+function T.callable(opts)
+  return make_node("scalar", {
+    kind = "callable",
+    opts = opts or {},
+    _check = check_callable
+  })
+end
+
 function T.enum(values, opts)
   opts = opts or {}
   opts.enum = values