Sha256: 3be8dd83e8bdbdf2afdefad7f5548ed04f53e74ee48acd387b7d72d3377a7281

Contents?: true

Size: 1.33 KB

Versions: 20

Compression:

Stored size: 1.33 KB

Contents

module GraphQL
  module StaticValidation
    # Scalars _can't_ have selections
    # Objects _must_ have selections
    class FieldsHaveAppropriateSelections
      include GraphQL::StaticValidation::Message::MessageHelper

      def validate(context)
        context.visitor[GraphQL::Language::Nodes::Field] << -> (node, parent)  {
          return if context.skip_field?(node.name)
          field_defn = context.field_definition
          validate_field_selections(node, field_defn, context)
        }
      end

      private

      def validate_field_selections(ast_field, field_defn, context)
        resolved_type = field_defn.type.unwrap

        if resolved_type.kind.scalar? && ast_field.selections.any?
          error = message("Selections can't be made on scalars (field '#{ast_field.name}' returns #{resolved_type.name} but has selections [#{ast_field.selections.map(&:name).join(", ")}])", ast_field, context: context)
        elsif resolved_type.kind.object? && ast_field.selections.none?
          error = message("Objects must have selections (field '#{ast_field.name}' returns #{resolved_type.name} but has no selections)", ast_field, context: context)
        else
          error = nil
        end

        if !error.nil?
          context.errors << error
          GraphQL::Language::Visitor::SKIP
        end
      end
    end
  end
end

Version data entries

20 entries across 20 versions & 1 rubygems

Version Path
graphql-0.19.3 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.19.2 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.19.1 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.19.0 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.15 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.14 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.13 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.12 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.11 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.10 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.9 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.8 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.7 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.6 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.5 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.4 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.3 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.2 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.1 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb
graphql-0.18.0 lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb