module SmartCore::Container::DependencyResolver

@api private @since 0.1.0

Constants

PATH_PART_SEPARATOR

@return [String]

@api private @since 0.4.0

Public Class Methods

dependency?(container, dependency_path, memoized: nil) click to toggle source

@param container [SmartCore::Container] @param dependency_path [String, Symbol] @option memoized [NilClass, Boolean] @return [Boolean]

@api private @since 0.5.0

# File lib/smart_core/container/dependency_resolver.rb, line 62
def dependency?(container, dependency_path, memoized: nil)
  entity = extract(container, dependency_path)

  case
  when memoized == nil
    entity.is_a?(SmartCore::Container::Entities::Dependency)
  when !!memoized == true
    entity.is_a?(SmartCore::Container::Entities::MemoizedDependency)
  when !!memoized == false
    entity.is_a?(SmartCore::Container::Entities::Dependency) &&
      !entity.is_a?(SmartCore::Container::Entities::MemoizedDependency)
  end
rescue SmartCore::Container::ResolvingError
  false
end
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.1.0 @version 0.8.1

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

@param container [SmartCore::Container] @param key [String, Symbol] @return [Boolean]

@api private @since 0.5.0

# File lib/smart_core/container/dependency_resolver.rb, line 36
def key?(container, key)
  extract(container, key)
  true
rescue SmartCore::Container::ResolvingError
  false
end
namespace?(container, namespace_path) click to toggle source

@param container [SmartCore::Container] @param namespace_path [String, Symbol] @return [Boolean]

@api private @since 0.5.0

# File lib/smart_core/container/dependency_resolver.rb, line 49
def namespace?(container, namespace_path)
  extract(container, namespace_path).is_a?(SmartCore::Container::Entities::Namespace)
rescue SmartCore::Container::ResolvingError
  false
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.1.0 @version 0.8.1

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

  Route.build(dependency_path).each do |cursor|
    entity = entity.registry.resolve(cursor.current_path)
    prevent_ambiguous_resolving!(cursor, entity)
    entity = entity.reveal(host_container)
    host_container = entity.is_a?(SmartCore::Container) ? entity : nil
  end
  entity
rescue SmartCore::Container::ResolvingError => error
  process_resolving_error(dependency_path, error)
end

Private Class Methods

extract(container, entity_path) click to toggle source

@param container [SmartCore::Container] @param entity_path [String, Symbol] @return [SmartCore::Container::Entities::Base]

@api private @since 0.5.0 @version 0.8.1

# File lib/smart_core/container/dependency_resolver.rb, line 115
def extract(container, entity_path)
  resolved_entity = container
  extracted_entity = container
  host_container = container

  Route.build(entity_path).each do |cursor|
    resolved_entity = resolved_entity.registry.resolve(cursor.current_path)
    extracted_entity = resolved_entity
    resolved_entity = resolved_entity.reveal(host_container)
    host_container = resolved_entity.is_a?(SmartCore::Container) ? resolved_entity : nil
  end

  extracted_entity
end
prevent_ambiguous_resolving!(cursor, entity) click to toggle source

@param cursor [SmartCore::Container::DependencyResolver::Route::Cursor] @param entity [SmartCore::Container::Entities::Base] @return [void]

@raise [SmartCore::Container::ResolvingError]

@api private @since 0.5.0

# File lib/smart_core/container/dependency_resolver.rb, line 138
def prevent_ambiguous_resolving!(cursor, entity)
  if cursor.last? && entity.is_a?(SmartCore::Container::Entities::Namespace)
    raise(
      SmartCore::Container::ResolvingError.new(
        'Trying to resolve a namespace as a dependency',
        path_part: cursor.current_path
      )
    )
  end

  if !cursor.last? && entity.is_a?(SmartCore::Container::Entities::Dependency)
    raise(
      SmartCore::Container::ResolvingError.new(
        'Trying to resolve nonexistent dependency',
        path_part: cursor.current_path
      )
    )
  end
end
process_resolving_error(dependency_path, error) click to toggle source

@param dependency_path [String, Symbol] @param error [SmartCore::Container::ResolvingError] @return [void]

@raise [SmartCore::Container::ResolvingError]

@api private @since 0.1.0

# File lib/smart_core/container/dependency_resolver.rb, line 166
def process_resolving_error(dependency_path, error)
  full_dependency_path = Route.build_path(error.path_part)
  message = "#{error.message} (incorrect path: \"#{full_dependency_path}\")"
  raise(SmartCore::Container::ResolvingError.new(message, path_part: full_dependency_path))
end