You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
2.5 KiB
Lua
112 lines
2.5 KiB
Lua
local pairs = pairs
|
|
local error = error
|
|
local setmetatable = setmetatable
|
|
|
|
local all = require("validation.rules.all")
|
|
local context = require("validation.context")
|
|
local message = require("validation.message")
|
|
|
|
local default_properties = {}
|
|
local last_messager = nil
|
|
local messager = error
|
|
local validation = {}
|
|
|
|
function validation.set_messager(callback)
|
|
last_messager = messager
|
|
messager = callback
|
|
end
|
|
|
|
function validation.restore_messager(_)
|
|
messager = last_messager or error
|
|
last_messager = nil
|
|
end
|
|
|
|
function validation.set_defaults(properties)
|
|
for key, value in pairs(properties) do
|
|
default_properties[key] = value
|
|
end
|
|
end
|
|
|
|
function validation:assert(input, properties)
|
|
local chain_context
|
|
|
|
chain_context = context.new(self, {
|
|
input = input,
|
|
})
|
|
chain_context:merge(properties or {})
|
|
chain_context:merge(default_properties)
|
|
chain_context:apply_rule()
|
|
|
|
if not chain_context.result then
|
|
local context_message = message.new(chain_context)
|
|
|
|
messager(context_message.get_full())
|
|
end
|
|
end
|
|
|
|
function validation:check(input, properties)
|
|
local chain_context
|
|
|
|
chain_context = context.new(self, {
|
|
input = input,
|
|
})
|
|
chain_context:merge(properties or {})
|
|
chain_context:merge(default_properties)
|
|
|
|
for _, rule in pairs(self.get_rules()) do
|
|
local child_context = chain_context:new_child(rule)
|
|
child_context:apply_rule()
|
|
|
|
if not child_context.result then
|
|
local child_message = message.new(child_context)
|
|
|
|
messager(child_message.get_single())
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
function validation:validate(input, properties)
|
|
local chain_context
|
|
|
|
chain_context = context.new(self, {
|
|
input = input,
|
|
})
|
|
chain_context:merge(properties or {})
|
|
chain_context:merge(default_properties)
|
|
chain_context:apply_rule()
|
|
|
|
return chain_context.result
|
|
end
|
|
|
|
function validation.new()
|
|
local new_validation = all()
|
|
local metatable = {}
|
|
|
|
for key, value in pairs(validation) do
|
|
new_validation[key] = value
|
|
end
|
|
|
|
function metatable:__index(key)
|
|
self._last = require("validation.rules." .. key) -- Use pcall to other prefices
|
|
|
|
return self
|
|
end
|
|
|
|
function metatable:__call(...)
|
|
self:add_rule(self._last(...))
|
|
|
|
return self
|
|
end
|
|
|
|
return setmetatable(new_validation, metatable)
|
|
end
|
|
|
|
return setmetatable(validation, {
|
|
__index = function(self, key)
|
|
local new_validation = validation.new()
|
|
|
|
return new_validation[key]
|
|
end,
|
|
})
|