module GraphQL::Client::DefinitionVariables

def self.operation_variables(schema, document, definition_name = nil)

Returns a Hash[Symbol] to VariableDefinition objects.

definition_name - A String definition name. Defaults to anonymous definition.
document - A GraphQL::Language::Nodes::Document to scan
schema - A GraphQL::Schema

definition.
Internal: Detect all variables used in a given operation or fragment
def self.operation_variables(schema, document, definition_name = nil)
  variables(schema, document, definition_name).map { |name, type|
    GraphQL::Language::Nodes::VariableDefinition.new(name: name.to_s, type: variable_node(type))
  }
end

def self.variable_node(type)

Returns GraphQL::Language::Nodes::Type.

type - A GraphQL::Type

Internal: Get AST node for GraphQL type.
def self.variable_node(type)
  case type.kind.name
  when "NON_NULL"
    GraphQL::Language::Nodes::NonNullType.new(of_type: variable_node(type.of_type))
  when "LIST"
    GraphQL::Language::Nodes::ListType.new(of_type: variable_node(type.of_type))
  else
    GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
  end
end

def self.variables(schema, document, definition_name = nil)

Returns a Hash[Symbol] to GraphQL::Type objects.

definition_name - A String definition name. Defaults to anonymous definition.
document - A GraphQL::Language::Nodes::Document to scan
schema - A GraphQL::Schema

definition.
Internal: Detect all variables used in a given operation or fragment
def self.variables(schema, document, definition_name = nil)
  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 document to be a GraphQL::Language::Nodes::Document, but was #{document.class}"
  end
  sliced_document = GraphQL::Language::DefinitionSlice.slice(document, definition_name)
  visitor = VariablesVisitor.new(sliced_document, schema: schema)
  visitor.visit
  visitor.variables
end