File: argument_literals_are_compatible.rb

package info (click to toggle)
ruby-graphql 2.2.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,584 kB
  • sloc: ruby: 67,505; ansic: 1,753; yacc: 831; javascript: 331; makefile: 6
file content (66 lines) | stat: -rw-r--r-- 2,398 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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# frozen_string_literal: true
module GraphQL
  module StaticValidation
    module ArgumentLiteralsAreCompatible
      def on_argument(node, parent)
        # Check the child arguments first;
        # don't add a new error if one of them reports an error
        super

        # Don't validate variables here
        if node.value.is_a?(GraphQL::Language::Nodes::VariableIdentifier)
          return
        end

        if @context.schema.error_bubbling || context.errors.none? { |err| err.path.take(@path.size) == @path }
          parent_defn = parent_definition(parent)

          if parent_defn && (arg_defn = context.warden.get_argument(parent_defn, node.name))
            validation_result = context.validate_literal(node.value, arg_defn.type)
            if !validation_result.valid?
              kind_of_node = node_type(parent)
              error_arg_name = parent_name(parent, parent_defn)
              string_value = if node.value == Float::INFINITY
                ""
              else
                " (#{GraphQL::Language::Printer.new.print(node.value)})"
              end

              problems = validation_result.problems
              first_problem = problems && problems.first
              if first_problem
                message = first_problem["message"]
                # This is some legacy stuff from when `CoercionError` was raised thru the stack
                if message
                  coerce_extensions = first_problem["extensions"] || {
                    "code" => "argumentLiteralsIncompatible"
                  }
                end
              end

              error_options = {
                nodes: parent,
                type: kind_of_node,
                argument_name: node.name,
                argument: arg_defn,
                value: node.value
              }
              if coerce_extensions
                error_options[:coerce_extensions] = coerce_extensions
              end

              message ||= "Argument '#{node.name}' on #{kind_of_node} '#{error_arg_name}' has an invalid value#{string_value}. Expected type '#{arg_defn.type.to_type_signature}'."

              error = GraphQL::StaticValidation::ArgumentLiteralsAreCompatibleError.new(
                message,
                **error_options
              )

              add_error(error)
            end
          end
        end
      end
    end
  end
end