Class: RubstApi::DependencyResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/rubst_api/dependencies.rb

Instance Method Summary collapse

Constructor Details

#initialize(request, overrides = {}) ⇒ DependencyResolver

Returns a new instance of DependencyResolver.



13
14
15
# File 'lib/rubst_api/dependencies.rb', line 13

def initialize(request, overrides = {})
  @request, @overrides, @cache, @cleanups = request, overrides, {}, []
end

Instance Method Details

#closeObject



32
33
34
35
36
# File 'lib/rubst_api/dependencies.rb', line 32

def close
  return if @closed
  @closed = true
  @cleanups.reverse_each(&:call)
end

#resolve(dependency) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/rubst_api/dependencies.rb', line 17

def resolve(dependency)
  callable = @overrides.fetch(dependency.callable, dependency.callable)
  return @cache[callable] if dependency.use_cache && @cache.key?(callable)
  signature = callable.respond_to?(:parameters) ? callable : callable.method(:call)
  arguments = dependency.dependencies.to_h { |name, child| [name, resolve(child)] }
  signature.parameters.each do |kind, name|
    next unless %i[key keyreq].include?(kind)
    arguments[name] = @request if name == :request
  end
  value = callable.call(**arguments)
  value = consume_generator(value) if value.is_a?(Enumerator)
  @cache[callable] = value if dependency.use_cache
  value
end