Zero-cost, compile-time, type-safe dependency injection library providing macros for automatic instance creation in Scala applications
npx @tessl/cli install tessl/maven-com-softwaremill-macwire--macros@2.6.0MacWire Macros is a zero-cost, compile-time, type-safe dependency injection library for Scala. It provides compile-time macros that generate instance creation code automatically while maintaining type safety and eliminating runtime overhead. The library supports multiple wiring strategies, from context-free dependency injection to context-dependent resolution using surrounding scope.
"com.softwaremill.macwire" %% "macros" % "2.6.6" % "provided""com.softwaremill.macwire" %% "util" % "2.6.6"import com.softwaremill.macwire.*For Scala 2:
import com.softwaremill.macwire._import com.softwaremill.macwire.*
// Define your classes
class DatabaseAccess()
class SecurityFilter()
class UserFinder(databaseAccess: DatabaseAccess, securityFilter: SecurityFilter)
class UserStatusReader(userFinder: UserFinder)
// Context-free wiring with autowire (Scala 3)
val userStatusReader = autowire[UserStatusReader]()
// Context-dependent wiring
trait UserModule {
lazy val databaseAccess = new DatabaseAccess()
lazy val securityFilter = new SecurityFilter()
lazy val userFinder = wire[UserFinder]
lazy val userStatusReader = wire[UserStatusReader]
}MacWire operates through several key mechanisms:
new instance creation codeautowire), context-dependent (wire), and recursive (wireRec) approacheswireWith family of functionswireSetContext-free dependency injection using explicitly provided dependencies. Creates instances without relying on surrounding scope.
// Scala 3 only
inline def autowire[T](inline dependencies: Any*): TCreates instances using dependencies available in the surrounding context (trait/class/object scope).
// Basic wiring
def wire[T]: T
// Recursive wiring - creates missing dependencies automatically
def wireRec[T]: T
// Set collection - gathers all instances of type T
def wireSet[T]: Set[T]Wires dependencies for factory functions, supporting functions with up to 22 parameters.
def wireWith[RES](factory: () => RES): RES
def wireWith[A, RES](factory: (A) => RES): RES
def wireWith[A, B, RES](factory: (A, B) => RES): RES
// ... overloads for up to 22 parametersCreates dynamic instance lookup capabilities from object members. Note: Only fully implemented in Scala 2.
def wiredInModule(in: AnyRef): Wired // Scala 2 implementation only// From util module - requires separate dependency
import com.softwaremill.macwire.WiredMacWire provides compile-time error detection for:
All errors are reported at compile time with descriptive messages indicating the specific issue and location.