File: document_types.rb

package info (click to toggle)
ruby-graphql-client 0.18.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 252 kB
  • sloc: ruby: 1,878; makefile: 4
file content (52 lines) | stat: -rw-r--r-- 1,856 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# frozen_string_literal: true
require "graphql"

module GraphQL
  class Client
    # Internal: Use schema to detect definition and field types.
    module DocumentTypes
      # Internal: Detect all types used in a given document
      #
      # schema - A GraphQL::Schema
      # document - A GraphQL::Language::Nodes::Document to scan
      #
      # Returns a Hash[Language::Nodes::Node] to GraphQL::Type objects.
      def self.analyze_types(schema, document)
        unless schema.is_a?(GraphQL::Schema) || (schema.is_a?(Class) && schema < GraphQL::Schema)
          raise TypeError, "expected schema to be a GraphQL::Schema, but was #{schema.class}"
        end

        unless document.is_a?(GraphQL::Language::Nodes::Document)
          raise TypeError, "expected schema to be a GraphQL::Language::Nodes::Document, but was #{document.class}"
        end

        visitor = GraphQL::Language::Visitor.new(document)
        type_stack = GraphQL::StaticValidation::TypeStack.new(schema, visitor)

        fields = {}

        visitor[GraphQL::Language::Nodes::OperationDefinition] << ->(node, _parent) do
          fields[node] = type_stack.object_types.last
        end
        visitor[GraphQL::Language::Nodes::FragmentDefinition] << ->(node, _parent) do
          fields[node] = type_stack.object_types.last
        end
        visitor[GraphQL::Language::Nodes::InlineFragment] << ->(node, _parent) do
          fields[node] = type_stack.object_types.last
        end
        visitor[GraphQL::Language::Nodes::Field] << ->(node, _parent) do
          fields[node] = type_stack.field_definitions.last.type
        end
        visitor.visit

        fields
      rescue StandardError => err
        if err.is_a?(TypeError)
          raise
        end
        # FIXME: TypeStack my crash on invalid documents
        fields
      end
    end
  end
end