From 34334396178eec3f72f1228b400cb9ec81c4ce4c Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Tue, 7 Jan 2025 14:07:14 +0100 Subject: build: Split up dependency injection into its own package --- src/main/kotlin/moe/nea/ledger/utils/di/DI.kt | 78 --------------------------- 1 file changed, 78 deletions(-) delete mode 100644 src/main/kotlin/moe/nea/ledger/utils/di/DI.kt (limited to 'src/main/kotlin/moe/nea/ledger/utils/di/DI.kt') diff --git a/src/main/kotlin/moe/nea/ledger/utils/di/DI.kt b/src/main/kotlin/moe/nea/ledger/utils/di/DI.kt deleted file mode 100644 index a9061d7..0000000 --- a/src/main/kotlin/moe/nea/ledger/utils/di/DI.kt +++ /dev/null @@ -1,78 +0,0 @@ -package moe.nea.ledger.utils.di - -import java.lang.reflect.AnnotatedElement -import java.util.Collections -import java.util.Stack - -@Suppress("UNCHECKED_CAST") -class DI { - private fun formatInjectionStack() = - injectionStack.joinToString(" -> ") - - fun getProvider(type: Class): BaseDIProvider { - val provider = providers[type] as BaseDIProvider? - ?: error("Could not find provider for type $type") - return provider - } - - private fun internalProvide(type: Class, element: AnnotatedElement? = null): T { - try { - val provider = getProvider(type) as BaseDIProvider - val context = if (element == null) provider.createEmptyContext() else provider.createContext(element) - val key = Pair(type, context) - val existingValue = values[key] - if (existingValue != null) return existingValue as T - if (type in injectionStack) { - error("Found injection cycle: ${formatInjectionStack()} -> $type") - } - injectionStack.push(type) - val value = - provider.provideWithContext(this, context) - val cycleCheckCookie = injectionStack.pop() - require(cycleCheckCookie == type) { "Unbalanced stack cookie: $cycleCheckCookie != $type" } - values[key] = value - return value - } catch (ex: Exception) { - throw RuntimeException("Could not create instance for type $type (in stack ${formatInjectionStack()})", ex) - } - } - - fun provide(type: Class, element: AnnotatedElement? = null): T { - return internalProvide(type, element) - } - - inline fun provide(): T = provide(T::class.java) - - fun register(type: Class, provider: BaseDIProvider) { - providers[type] = provider - } - - fun registerInjectableClasses(vararg type: Class<*>) { - type.forEach { internalRegisterInjectableClass(it) } - } - - private fun internalRegisterInjectableClass(type: Class) { - register(type, DIProvider.fromInjectableClass(type)) - } - - fun instantiateAll() { - providers.keys.forEach { - provide(it, null) - } - } - - fun getAllInstances(): Collection = - Collections.unmodifiableCollection(values.values) - - fun registerSingleton(value: T) { - register(value.javaClass, DIProvider.singeleton(value)) - } - - private val injectionStack: Stack> = Stack() - private val values = mutableMapOf, *>, Any>() - private val providers = mutableMapOf, BaseDIProvider<*, *>>() - - init { - registerSingleton(this) - } -} \ No newline at end of file -- cgit