Class: GraphQL::Models::Instrumentation

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

Instance Method Summary collapse

Constructor Details

#initialize(skip_nil_models = true) ⇒ Instrumentation

Returns a new instance of Instrumentation.

Parameters:

  • skip_nil_models (defaults to: true)

    If true, field resolvers (in proxy_to or backed_by_model blocks) will not be invoked if the model is nil.



5
6
7
# File 'lib/graphql/models/instrumentation.rb', line 5

def initialize(skip_nil_models = true)
  @skip_nil_models = skip_nil_models
end

Instance Method Details

#instrument(type, field) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/graphql/models/instrumentation.rb', line 9

def instrument(type, field)
  field_info = GraphQL::Models.field_info(type, field.name)
  return field unless field_info

  old_resolver = field.resolve_proc

  new_resolver = -> (object, args, ctx) {
    Promise.resolve(field_info.object_to_base_model.call(object)).then do |base_model|
      GraphQL::Models.load_association(base_model, field_info.path, ctx).then do |model|
        next nil if model.nil? && @skip_nil_models
        old_resolver.call(model, args, ctx)
      end
    end
  }

  field.redefine do
    resolve(new_resolver)
  end
end