module SmartCore::Container::DependencyResolver

@api private @since 0.7.0

Public Class Methods

fetch(container, dependency_path) click to toggle source

@param container [SmartCore::Container] @param dependency_path [String, Symbol] @return [SmartCore::Container, Any]

@see SmartCore::Container::Registry#resolve @see SmartCore::Container::Entities::Namespace#reveal @see SmartCore::Container::Entities::Dependency#reveal

@api private @since 0.8.0

# File lib/smart_core/container/dependency_resolver.rb, line 19
def fetch(container, dependency_path)
  container.registry.resolve(dependency_path).reveal
end
resolve(container, dependency_path) click to toggle source

@param container [SmartCore::Container] @param dependency_path [String, Symbol] @return [SmartCore::Container, Any]

@see SmartCore::Container::Registry#resolve @see SmartCore::Container::Entities::Namespace#reveal @see SmartCore::Container::Entities::Dependency#reveal

@raise [SmartCore::Container::ResolvingError]

@api private @since 0.7.0 @version 0.8.0

# File lib/smart_core/container/dependency_resolver.rb, line 36
    def resolve(container, dependency_path)
      entity = container

      Route.build(dependency_path).each do |cursor|
        entity = entity.registry.resolve(cursor.current_path)
        if cursor.last? && entity.is_a?(SmartCore::Container::Entities::Namespace)
          # rubocop:enable Metrics/LineLength
          raise(SmartCore::Container::ResolvingError.new(<<~MESSAGE, path_part: cursor.current_path))
            Trying to resolve a namespace as a dependency
          MESSAGE
          # rubocop:disable Metrics/LineLength
        end
        if !cursor.last? && entity.is_a?(SmartCore::Container::Entities::Dependency)
          # rubocop:enable Metrics/LineLength
          raise(SmartCore::Container::ResolvingError.new(<<~MESSAGE, path_part: cursor.current_path))
            Trying to resolve nonexistent dependency
          MESSAGE
          # rubocop:disable Metrics/LineLength
        end
        entity = entity.reveal
      end

      entity
    rescue SmartCore::Container::ResolvingError => error
      full_dependency_path = Route.build_path(dependency_path, error.path_part)
      raise(SmartCore::Container::ResolvingError.new(<<~MESSAGE, path_part: full_dependency_path))
        #{error.message} (incorrect path: "#{full_dependency_path}")
      MESSAGE
    end