Sha256: af67bf37bbe126d0a915114cb506d8ccda0253bf4dcc7f381e94c7d62749d027

Contents?: true

Size: 1.32 KB

Versions: 2

Compression:

Stored size: 1.32 KB

Contents

# frozen_string_literal: true

module Wireless
  # A mixin which provides the #fetch method (and #[] alias) shared by Wireless::Registry
  # and the cut-down version, Wireless::Fetcher, which is passed to the blocks used
  # to resolve dependencies.
  #
  # In both cases, @registry and @seen need to be defined as instance variables.
  # @registry is a hash of { name (Symbol) => dependency (Object) } pairs, and
  # @seen is an immutable Set of symbols, which is used to detect dependency cycles.
  module Fetch
    # Fetches the dependency with the specified name. Creates the dependency if
    # it doesn't exist. Raises a Wireless::KeyError if the dependency is not
    # defined or a Wireless::CycleError if resolving the dependency results in
    # a cycle.
    def fetch(name)
      name = name.to_sym

      if @seen.include?(name)
        path = [*@seen, name].join(' -> ')
        raise Wireless::CycleError, "cycle detected: #{path}"
      end

      unless (resolver = @registry[name])
        raise Wireless::KeyError.new(
          "dependency not found: #{name}",
          key: name,
          receiver: self
        )
      end

      fetcher = lambda do
        seen = @seen.dup
        seen.add(name)
        Fetcher.new(registry: @registry, seen: seen)
      end

      resolver.resolve(fetcher)
    end

    alias [] fetch
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
wireless-0.1.0 lib/wireless/fetch.rb
wireless-0.0.2 lib/wireless/fetch.rb