module GraphQL::StaticValidation::ArgumentsAreDefined

Public Instance Methods

on_argument(node, parent) click to toggle source
Calls superclass method
# File lib/graphql/static_validation/rules/arguments_are_defined.rb, line 5
def on_argument(node, parent)
  parent_defn = parent_definition(parent)

  if parent_defn && context.warden.get_argument(parent_defn, node.name)
    super
  elsif parent_defn
    kind_of_node = node_type(parent)
    error_arg_name = parent_name(parent, parent_defn)
    add_error(GraphQL::StaticValidation::ArgumentsAreDefinedError.new(
      "#{kind_of_node} '#{error_arg_name}' doesn't accept argument '#{node.name}'",
      nodes: node,
      name: error_arg_name,
      type: kind_of_node,
      argument_name: node.name,
      parent: parent_defn
    ))
  else
    # Some other weird error
    super
  end
end

Private Instance Methods

node_type(parent) click to toggle source
# File lib/graphql/static_validation/rules/arguments_are_defined.rb, line 43
def node_type(parent)
  parent.class.name.split("::").last
end
parent_definition(parent) click to toggle source
# File lib/graphql/static_validation/rules/arguments_are_defined.rb, line 47
def parent_definition(parent)
  case parent
  when GraphQL::Language::Nodes::InputObject
    arg_defn = context.argument_definition
    if arg_defn.nil?
      nil
    else
      arg_ret_type = arg_defn.type.unwrap
      if arg_ret_type.kind.input_object?
        arg_ret_type
      else
        nil
      end
    end
  when GraphQL::Language::Nodes::Directive
    context.schema_directives[parent.name]
  when GraphQL::Language::Nodes::Field
    context.field_definition
  else
    raise "Unexpected argument parent: #{parent.class} (##{parent})"
  end
end
parent_name(parent, type_defn) click to toggle source

TODO smell: these methods are added to all visitors, since they’re included in a module.

# File lib/graphql/static_validation/rules/arguments_are_defined.rb, line 30
def parent_name(parent, type_defn)
  case parent
  when GraphQL::Language::Nodes::Field
    parent.alias || parent.name
  when GraphQL::Language::Nodes::InputObject
    type_defn.graphql_name
  when GraphQL::Language::Nodes::Argument, GraphQL::Language::Nodes::Directive
    parent.name
  else
    raise "Invariant: Unexpected parent #{parent.inspect} (#{parent.class})"
  end
end