This is very fast validator with abilities to perform complex cascade inplace structure changes and to raise custom API-like errros
local val = require 'val'
local structure_validator = val.idator({
req_num1 = 'number';
req_num2 = '+number';
req_num3 = 'req number';
req_num4 = 'required number';
req_num5 = val.req('number');
req_num6 = val.required('number');
opt_str1 = '?string';
opt_str2 = 'opt string';
opt_str3 = 'optional string';
opt_str4 = 'maybe string';
opt_str5 = val.opt('string');
opt_str6 = val.optional('string');
opt_str7 = val.maybe('string');
custom_value = function(value, name)
if type(value) == 'string' then
if value:upper() ~= value then
error({ 'invalid', name .. ' should be either uppercase string or positive number'})
end
elseif type(value) == 'number' then
if value <= 0 then
error({ 'invalid', name .. ' should be either uppercase string or positive number'})
end
else
error({ 'invalid', name .. ' should be either uppercase string or positive number'})
end
return value
end;
nested = {
nested_string = '+string';
nested_number = '+number';
};
complex_cast_cascade = val.required(
'number',
tostring,
'string',
function(value, name)
if value:len() % 2 ~= 0 then
error({ 'invalid', name .. ' should be number, that can be written in odd amount of symbols' })
end
return tonumber(value)
end,
'number'
);
})
-- does not raise
local r, e = pcall(structure_validator, {
req_num1 = 1;
req_num2 = 1;
req_num3 = 1;
req_num4 = 1;
req_num5 = 1;
req_num6 = 1;
opt_str1 = 'some string';
opt_str3 = 'some string';
opt_str5 = 'some string';
opt_str7 = 'some string';
custom_value = 2;
nested = {
nested_string = 'some string';
nested_number = 42;
};
complex_cast_cascade = 1234;
})
-- raises error "args.complex_cast_cascade is invalid with value 123: args.complex_cast_cascade should be number, that can be written in odd amount of symbols"
local r, e = pcall(structure_validator, {
req_num1 = 1;
req_num2 = 1;
req_num3 = 1;
req_num4 = 1;
req_num5 = 1;
req_num6 = 1;
opt_str1 = 'some string';
opt_str3 = 'some string';
opt_str5 = 'some string';
opt_str7 = 'some string';
custom_value = 2;
nested = {
nested_string = 'some string';
nested_number = 42;
};
complex_cast_cascade = 123;
})
print("Raised error: " .. e)
-- raises error "args.custom_value is invalid with value qwe: args.custom_value should be either uppercase string or positive number"
local r, e = pcall(structure_validator, {
req_num1 = 1;
req_num2 = 1;
req_num3 = 1;
req_num4 = 1;
req_num5 = 1;
req_num6 = 1;
opt_str1 = 'some string';
opt_str3 = 'some string';
opt_str5 = 'some string';
opt_str7 = 'some string';
custom_value = 'qwe';
nested = {
nested_string = 'some string';
nested_number = 42;
};
complex_cast_cascade = 1234;
})
print("Raised error: " .. e)
-- following forms are equivalent
local val1 = val.idator({ a = 'number' })
local val2 = val.validator({ a = 'number' })
local val3 = val({ a = 'number' })
-- you can pass both schema and custom error handlers
local validator_w_custom_handler = val.idator({
num = 'number';
str = 'string';
custom = function(value, name)
if not value then
error({ 'custom', name .. ' should be something that casts to true in Lua' })
end
return value
end;
}, {
handler = function (key, value, err)
local reason = err[1]
local message = err[2]
if reason == 'invalid' then
return { 400, {
Code = 'EnterpriseLikeBigCodeForInvalidArguments';
Key = key;
Value = value;
Message = message;
} }
elseif reason == 'missing' then
return { 400, {
Code = 'EnterpriseLikeBigCodeForMissingArgument';
Key = key;
Value = value;
Message = message;
} }
else
return { 500, {
Code = 'EnterpriseLikeBigCodeForInternalError';
Debug = message;
Message = 'Internal Error';
} }
end
end;
})
local r, e = pcall(validator_w_custom_handler, {
num = 'some random string';
str = 'some random string';
custom = true;
})
print(string.format("Custom error handler raised error: %s", require 'json' .encode(e)))
local r, e = pcall(validator_w_custom_handler, {
num = 100;
custom = true;
})
print(string.format("Custom error handler raised error: %s", require 'json' .encode(e)))
local r, e = pcall(validator_w_custom_handler, {
num = 100;
str = 'qwe';
custom = false;
})
print(string.format("Custom error handler raised error: %s", require 'json' .encode(e)))
- Incorrect validation for optional nested structures
- array-of primitive
- non-empty-string primitive
- any-number primitive