All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.softwaremill.macwire.InstanceLookup.scala Maven / Gradle / Ivy

The newest version!
package com.softwaremill.macwire

class InstanceLookup(instancesByClass: Map[Class[_], AnyRef]) {
  private val lookupMap = prepareMap

  def lookup[T](cls: Class[T]): List[T] = {
    lookupMap.getOrElse(cls, Nil).map(_.asInstanceOf[T])
  }

  def lookupSingleOrThrow[T](cls: Class[T]) = lookup(cls) match {
    case Nil => throw new RuntimeException(s"Cannot find instances of class $cls!")
    case List(i) => i
    case l => throw new RuntimeException(s"Found multiple instances of class $cls: $l!")
  }

  private def prepareMap: Map[Class[_], List[AnyRef]] = {
    instancesByClass
      .toList
      .flatMap { case (startingCls, inst) =>
      def allSuperClasses(cls: Class[_]): List[Class[_]] = {
        if (cls == null) {
          Nil
        } else {
          (cls :: allSuperClasses(cls.getSuperclass)) ++ cls.getInterfaces.flatMap(allSuperClasses)
        }
      }

      allSuperClasses(inst.getClass).map(_ -> inst)
    }.groupBy(_._1)
    .map { case (cls, clsAndInsts) => cls -> clsAndInsts.map(_._2) }
    .toMap
  }
}

object InstanceLookup {
  def apply(instancesByClass: Map[Class[_], AnyRef]) = new InstanceLookup(instancesByClass)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy