def _validate(value, rule, path, errors, done, uniq_table, recursive=true)
if !Types.scalar?(value)
return if done[value.__id__]
done[value.__id__] = rule
end
if rule.required && value.nil?
errors << validate_error(:required_novalue, rule, path, value)
return
end
if rule.type_class && !value.nil? && !value.is_a?(rule.type_class)
unless rule.classobj && value.is_a?(rule.classobj)
errors << validate_error(:type_unmatch, rule, path, value, [Kwalify.word(rule.type)])
return
end
end
n = errors.length
if rule.sequence
_validate_sequence(value, rule, path, errors, done, uniq_table, recursive)
elsif rule.mapping
_validate_mapping(value, rule, path, errors, done, uniq_table, recursive)
else
_validate_scalar(value, rule, path, errors, done, uniq_table)
end
return unless errors.length == n
validate_hook(value, rule, path, errors)
@block.call(value, rule, path, errors) if @block
end