in lib/core/filtering/hash_against_schema_validator.rb [22:60]
def validate_against_schema(schema = @schema, payload = @payload, recursion_depth = 0)
return unexpected_error if exceeded_recursion_depth?(recursion_depth)
return valid_snippet unless schema.present?
schema_fields = schema[:fields].is_a?(Hash) ? schema.dig(:fields, :values) : schema[:fields]
snippet_field_names = payload&.keys&.map(&:to_s)
schema_field_names = schema_fields.map { |field| field[:name] }
return unexpected_field(schema_field_names, snippet_field_names) if unexpected_field_present?(snippet_field_names, schema_field_names)
return fields_constraint_violation(schema[:fields]) if fields_constraints_violated?(schema[:fields], payload)
schema_fields.each do |field|
name = field[:name]
type = field[:type]
optional = field[:optional] || false
snippet_field_value = payload.nil? ? nil : payload.with_indifferent_access[name]
next if optional && (snippet_field_value.nil? || !snippet_field_value.present?)
return required_value_missing(name) if is_required_value_missing?(snippet_field_value)
type_error_present, error_message = type_error_present?(name, type, snippet_field_value)
return wrong_type(error_message) if type_error_present
if field[:fields].present?
validation_result = validate_against_schema(field, snippet_field_value, recursion_depth + 1)
return validation_result unless validation_result[:state] == Core::Filtering::ValidationStatus::VALID
end
end
valid_snippet
end