]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Add generic tool to add universal maps for lua modules
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 24 Nov 2016 11:34:42 +0000 (11:34 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 24 Nov 2016 11:35:08 +0000 (11:35 +0000)
src/lua/global_functions.lua

index 31ee6c8c4eb8d8b1d122704390831bdde5814b02..f335caf4013de9ad87583c958cac88785943e74b 100644 (file)
@@ -386,3 +386,82 @@ function rspamd_count_metatokens()
 
   return total
 end
+
+function rspamd_map_add(mname, optname, mtype, description)
+  local ret = {
+    get_key = function(t, k)
+      if t.__data then
+        return t.__data:get_key(k)
+      end
+
+      return nil
+    end
+  }
+  local ret_mt = {
+    __index = function(t, k)
+      if t.__data then
+        return t.get_key(k)
+      end
+
+      return nil
+    end
+  }
+  local opt = rspamd_config:get_module_opt(mname, optname)
+
+  if not opt then
+    return nil
+  end
+
+  if type(opt) == 'string' then
+    -- We have a single string, so we treat it as a map
+    local map = rspamd_config:add_map{
+      type = mtype,
+      description = description,
+      url = opt,
+    }
+
+    if map then
+      ret.__data = map
+      setmetatable(ret, ret_mt)
+      return ret
+    end
+  elseif type(opt) == 'table' then
+    -- it might be plain map or map of plain elements
+    if opt[1] then
+      if mtype == 'radix' then
+        local map = rspamd_config:radix_from_config(mname, optname)
+
+        if map then
+          ret.__data = map
+          setmetatable(ret, ret_mt)
+          return ret
+        end
+      else
+        local data = {}
+        for _,elt in ipairs(opt) do
+          if type(elt) == 'string' then
+            table.insert(data, tostring(elt))
+          end
+        end
+
+        ret.__data = data
+        ret.get_key = function(t, k)
+          return t.__data[k]
+        end
+      end
+    else
+      local map = rspamd_config:add_map{
+        type = mtype,
+        description = description,
+        url = opt,
+      }
+      if map then
+        ret.__data = map
+        setmetatable(ret, ret_mt)
+        return ret
+      end
+    end
+  end
+
+  return nil
+end