module GraphQL::Schema::TypeExpression

@api private

Public Class Methods

build_type(type_owner, ast_node) click to toggle source

Fetch a type from a type map by its AST specification. Return ‘nil` if not found. @param type_owner [#get_type] A thing for looking up types by name @param ast_node [GraphQL::Language::Nodes::AbstractNode] @return [Class, GraphQL::Schema::NonNull, GraphQL::Schema:List]

# File lib/graphql/schema/type_expression.rb, line 11
def self.build_type(type_owner, ast_node)
  case ast_node
  when GraphQL::Language::Nodes::TypeName
    type_owner.get_type(ast_node.name) # rubocop:disable Development/ContextIsPassedCop -- this is a `context` or `warden`, it's already query-aware
  when GraphQL::Language::Nodes::NonNullType
    ast_inner_type = ast_node.of_type
    inner_type = build_type(type_owner, ast_inner_type)
    wrap_type(inner_type, :to_non_null_type)
  when GraphQL::Language::Nodes::ListType
    ast_inner_type = ast_node.of_type
    inner_type = build_type(type_owner, ast_inner_type)
    wrap_type(inner_type, :to_list_type)
  else
    raise "Invariant: unexpected type from ast: #{ast_node.inspect}"
  end
end

Private Class Methods

wrap_type(type, wrapper_method) click to toggle source
# File lib/graphql/schema/type_expression.rb, line 31
def wrap_type(type, wrapper_method)
  if type.nil?
    nil
  elsif wrapper_method == :to_list_type || wrapper_method == :to_non_null_type
    type.public_send(wrapper_method)
  else
    raise ArgumentError, "Unexpected wrapper method: #{wrapper_method.inspect}"
  end
end