SyntaxGameServer/RCCService2018/content/Rhodium/Modules/Test4R/createModdableFunction.lua

39 lines
1.0 KiB
Lua

--[[createModdableFunction can be used to build a Moddable function in a chain style
for example:
validModifiers = {
protected = Enums.Modifier.Protect,
skipped = Enums.Modifier.Skip,
}
describe = createModdableFunction(validModifiers, callback)
describe.protected.skipped("description", function() end)
step.skipped("description", function() end)
]]
local function createModdableFunction(validModifiers, method, appliedModifiers)
if appliedModifiers == nil then
appliedModifiers = {}
end
return setmetatable({}, {
__call = function(_, ...)
return method(appliedModifiers, ...)
end,
__index = function(_, key)
if not validModifiers[key] then
error(("%q is not a valid modifier"):format(tostring(key)), 2)
end
local newAppliedModifiers = {}
for key, value in pairs(appliedModifiers) do
newAppliedModifiers[key] = value
end
newAppliedModifiers[validModifiers[key]] = true
return createModdableFunction(validModifiers, method, newAppliedModifiers)
end,
})
end
return createModdableFunction