Lua field-level input validation with rules

Lua
local schema = {
  name = function(v) if type(v) ~= 'string' or #v < 2 then return 'must be at least 2 characters' end end,
  age = function(v) if type(v) ~= 'number' or v < 18 or v % 1 ~= 0 then return 'must be an integer of 18 or more' end end,
  email = function(v) if type(v) ~= 'string' or not v:match('^[%w._%%+-]+@[%w.-]+%.%a%a+$') then return 'must be a valid email' end end,
}

local function validate(input, rules)
  local errors, clean = {}, {}
  for field, check in pairs(rules) do
    local err = check(input[field])
    if err then errors[field] = err else clean[field] = input[field] end
  end
  if next(errors) then return nil, errors end
  return clean
end

return { validate = validate, schema = schema }