Class: GraphQL::Query::Variables

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/graphql/query/variables.rb

Overview

Read-only access to query variables, applying default values if needed.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ctx, ast_variables, provided_variables) ⇒ Variables

Returns a new instance of Variables.

[View source]

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
67
68
69
# File 'lib/graphql/query/variables.rb', line 13

def initialize(ctx, ast_variables, provided_variables)
  schema = ctx.schema
  @context = ctx

  @provided_variables = GraphQL::Argument.deep_stringify(provided_variables)
  @errors = []
  @storage = ast_variables.each_with_object({}) do |ast_variable, memo|
    # Find the right value for this variable:
    # - First, use the value provided at runtime
    # - Then, fall back to the default value from the query string
    # If it's still nil, raise an error if it's required.
    variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
    if variable_type.nil?
      # Pass -- it will get handled by a validator
    else
      variable_name = ast_variable.name
      default_value = ast_variable.default_value
      provided_value = @provided_variables[variable_name]
      value_was_provided =  @provided_variables.key?(variable_name)
      begin
        validation_result = variable_type.validate_input(provided_value, ctx)
        if validation_result.valid?
          if value_was_provided
            # Add the variable if a value was provided
            memo[variable_name] = if ctx.interpreter?
              provided_value
            elsif provided_value.nil?
              nil
            else
              schema.error_handler.with_error_handling(context) do
                variable_type.coerce_input(provided_value, ctx)
              end
            end
          elsif default_value != nil
            memo[variable_name] = if ctx.interpreter?
              default_value
            else
              # Add the variable if it wasn't provided but it has a default value (including `null`)
              GraphQL::Query::LiteralInput.coerce(variable_type, default_value, self)
            end
          end
        end
      rescue GraphQL::ExecutionError => ex
        # TODO: This should really include the path to the problematic node in the variable value
        # like InputValidationResults generated by validate_non_null_input but unfortunately we don't
        # have this information available in the coerce_input call chain. Note this path is the path
        # that appears under errors.extensions.problems.path and NOT the result path under errors.path.
        validation_result = GraphQL::Query::InputValidationResult.new
        validation_result.add_problem(ex.message)
      end

      if !validation_result.valid?
        @errors << GraphQL::Query::VariableValidationError.new(ast_variable, variable_type, provided_value, validation_result)
      end
    end
  end
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.


11
12
13
# File 'lib/graphql/query/variables.rb', line 11

def context
  @context
end

#errorsArray<GraphQL::Query::VariableValidationError> (readonly)

Returns Any errors encountered when parsing the provided variables and literal values.

Returns:


9
10
11
# File 'lib/graphql/query/variables.rb', line 9

def errors
  @errors
end