class Dry::Effects::Providers::Resolve

Constants

Locate

Attributes

dynamic[R]
parent[R]

Public Class Methods

handle_method(*, as: Undefined, **) click to toggle source
# File lib/dry/effects/providers/resolve.rb, line 10
def self.handle_method(*, as: Undefined, **)
  Undefined.default(as, :provide)
end
new(*) click to toggle source
Calls superclass method
# File lib/dry/effects/providers/resolve.rb, line 24
def initialize(*)
  super
  @dynamic = EMPTY_HASH
end

Public Instance Methods

call(dynamic = EMPTY_HASH, options = EMPTY_HASH) { || ... } click to toggle source

Yield the block with the handler installed

@api private

# File lib/dry/effects/providers/resolve.rb, line 52
def call(dynamic = EMPTY_HASH, options = EMPTY_HASH)
  @dynamic = dynamic

  if options.fetch(:overridable, false)
    @parent = ::Dry::Effects.yield(Locate) { nil }
  else
    @parent = nil
  end

  yield
ensure
  @dynamic = EMPTY_HASH
end
key?(key) click to toggle source

@param [Symbol,String] key Dependency key @return [Boolean] @api public

# File lib/dry/effects/providers/resolve.rb, line 80
def key?(key)
  static.key?(key) || dynamic.key?(key) || parent&.key?(key)
end
locate() click to toggle source

Locate handler in the stack

@return [Provider] @api private

# File lib/dry/effects/providers/resolve.rb, line 45
def locate
  self
end
provide?(effect) click to toggle source

@param [Effect] effect @return [Boolean] @api public

Calls superclass method
# File lib/dry/effects/providers/resolve.rb, line 69
def provide?(effect)
  if super
    !effect.name.equal?(:resolve) || key?(effect.payload[0])
  else
    false
  end
end
represent() click to toggle source

@return [String] @api public

# File lib/dry/effects/providers/resolve.rb, line 86
def represent
  containers = [represent_container(static), represent_container(dynamic)].compact.join("+")
  "resolve[#{containers.empty? ? "empty" : containers}]"
end
represent_container(container) click to toggle source

@return [String] @api private

# File lib/dry/effects/providers/resolve.rb, line 93
def represent_container(container)
  case container
  when ::Hash
    container.empty? ? nil : "hash"
  when ::Class
    container.name || container.to_s
  else
    container.to_s
  end
end
resolve(key) click to toggle source
# File lib/dry/effects/providers/resolve.rb, line 29
def resolve(key)
  if parent&.key?(key)
    parent.resolve(key)
  elsif dynamic.key?(key)
    dynamic[key]
  elsif static.key?(key)
    static[key]
  else
    Instructions.Raise(Errors::ResolutionError.new(key))
  end
end