39 lines
1.0 KiB
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 |