Module: GraphQL::Tracing::LegacyHooksTrace::RunHooks

Defined in:
lib/graphql/tracing/legacy_hooks_trace.rb

Class Method Summary collapse

Class Method Details

.call_after_hooks(instrumenters, object, after_hook_name, ex) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/graphql/tracing/legacy_hooks_trace.rb', line 62

def call_after_hooks(instrumenters, object, after_hook_name, ex)
  instrumenters.reverse_each do |instrumenter|
    begin
      instrumenter.public_send(after_hook_name, object)
    rescue => e
      ex = e
    end
  end
  ex
end

.call_hooks(instrumenters, object, before_hook_name, after_hook_name) ⇒ Object

Call each before hook, and if they all succeed, yield. If they don’t all succeed, call after_ for each one that succeeded.



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/graphql/tracing/legacy_hooks_trace.rb', line 37

def call_hooks(instrumenters, object, before_hook_name, after_hook_name)
  begin
    successful = []
    instrumenters.each do |instrumenter|
      instrumenter.public_send(before_hook_name, object)
      successful << instrumenter
    end

    # if any before hooks raise an exception, quit calling before hooks,
    # but call the after hooks on anything that succeeded but also
    # raise the exception that came from the before hook.
  rescue GraphQL::ExecutionError => err
    object.context.errors << err
  rescue => e
    raise call_after_hooks(successful, object, after_hook_name, e)
  end

  begin
    yield # Call the user code
  ensure
    ex = call_after_hooks(successful, object, after_hook_name, nil)
    raise ex if ex
  end
end

.each_query_call_hooks(instrumenters, queries, i = 0) ⇒ Object

Call the before_ hooks of each query, Then yield if no errors. call_hooks takes care of appropriate cleanup.



22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/graphql/tracing/legacy_hooks_trace.rb', line 22

def each_query_call_hooks(instrumenters, queries, i = 0)
  if i >= queries.length
    yield
  else
    query = queries[i]
    call_hooks(instrumenters, query, :before_query, :after_query) {
      each_query_call_hooks(instrumenters, queries, i + 1) {
        yield
      }
    }
  end
end