validate_against_schema

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