Class: GraphQL::Function

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/function.rb

Overview

A reusable container for field logic, including arguments, resolve, return type, and documentation.

Class-level values defined with the DSL will be inherited, so Functions can extend one another.

It's OK to override the instance methods here in order to customize behavior of instances.

Examples:

A reusable GraphQL::Function attached as a field

class FindRecord < GraphQL::Function
  attr_reader :type

  def initialize(model:, type:)
    @model = model
    @type = type
  end

  argument :id, GraphQL::ID_TYPE

  def call(obj, args, ctx)
     @model.find(args.id)
  end
end

QueryType = GraphQL::ObjectType.define do
  name "Query"
  field :post, function: FindRecord.new(model: Post, type: PostType)
  field :comment, function: FindRecord.new(model: Comment, type: CommentType)
end

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.argument(*args, **kwargs, &block) ⇒ void

This method returns an undefined value.

Define an argument for this function & its subclasses

See Also:

  • same arguments as the `argument` definition helper


66
67
68
69
70
# File 'lib/graphql/function.rb', line 66

def argument(*args, **kwargs, &block)
  argument = GraphQL::Argument.from_dsl(*args, **kwargs, &block)
  own_arguments[argument.name] = argument
  nil
end

.argumentsHash<String => GraphQL::Argument>

Returns Arguments for this function class, including inherited arguments.

Returns:

  • (Hash<String => GraphQL::Argument>)

    Arguments for this function class, including inherited arguments



73
74
75
76
77
78
79
# File 'lib/graphql/function.rb', line 73

def arguments
  if parent_function?
    own_arguments.merge(superclass.arguments)
  else
    own_arguments.dup
  end
end

.complexity(new_value = nil) ⇒ Object

Get or set this class's complexity



124
# File 'lib/graphql/function.rb', line 124

inherited_value(:complexity)

.deprecation_reason(new_value = nil) ⇒ Object

Get or set this class's deprecation_reason



121
# File 'lib/graphql/function.rb', line 121

inherited_value(:deprecation_reason)

.description(new_value = nil) ⇒ Object

Get or set this class's description



118
# File 'lib/graphql/function.rb', line 118

inherited_value(:description)

.inherited_value(name) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Class-level reader/writer which is inherited



102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/graphql/function.rb', line 102

def self.inherited_value(name)
  self.class_eval <<-RUBY
    def #{name}(new_value = nil)
      if new_value
        @#{name} = new_value
      elsif parent_function?
        @#{name} || superclass.#{name}
      else
        @#{name}
      end
    end
  RUBY
end

.type(premade_type = nil, &block) ⇒ GraphQL::BaseType

Get or set the return type for this function class & descendants

Returns:



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/graphql/function.rb', line 88

def type(premade_type = nil, &block)
  if block_given?
    @type = GraphQL::ObjectType.define(&block)
  elsif premade_type
    @type = premade_type
  elsif parent_function?
    @type || superclass.type
  else
    @type
  end
end

.typesObject

Provides shorthand access to GraphQL's built-in types



82
83
84
# File 'lib/graphql/function.rb', line 82

def types
  GraphQL::Define::TypeDefiner.instance
end

Instance Method Details

#argumentsHash<String => GraphQL::Argument>

Returns Arguments, keyed by name.

Returns:



33
34
35
# File 'lib/graphql/function.rb', line 33

def arguments
  self.class.arguments
end

#call(obj, args, ctx) ⇒ Object

Returns This function's resolver.

Returns:

  • (Object)

    This function's resolver

Raises:

  • (NotImplementedError)


43
44
45
# File 'lib/graphql/function.rb', line 43

def call(obj, args, ctx)
  raise NotImplementedError
end

#complexityInteger, Proc

Returns:

  • (Integer, Proc)


58
59
60
# File 'lib/graphql/function.rb', line 58

def complexity
  self.class.complexity || 1
end

#deprecation_reasonString?

Returns:

  • (String, nil)


53
54
55
# File 'lib/graphql/function.rb', line 53

def deprecation_reason
  self.class.deprecation_reason
end

#descriptionString?

Returns:

  • (String, nil)


48
49
50
# File 'lib/graphql/function.rb', line 48

def description
  self.class.description
end

#typeGraphQL::BaseType

Return type

Returns:



38
39
40
# File 'lib/graphql/function.rb', line 38

def type
  self.class.type
end