diff options
author | Linnea Gräf <nea@nea.moe> | 2024-12-15 19:31:46 +0100 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-12-15 19:31:46 +0100 |
commit | a2f73de90fb9c9d0ea7a5e7e9e6b9e445a8094ee (patch) | |
tree | 4b612c6451c695822885c29e9f497e2826dc3bbd /src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt | |
parent | 0a4cf1fbcc897462f31aaadc5c868d12d13e1abb (diff) | |
download | LocalTransactionLedger-a2f73de90fb9c9d0ea7a5e7e9e6b9e445a8094ee.tar.gz LocalTransactionLedger-a2f73de90fb9c9d0ea7a5e7e9e6b9e445a8094ee.tar.bz2 LocalTransactionLedger-a2f73de90fb9c9d0ea7a5e7e9e6b9e445a8094ee.zip |
refactor: Move DI to its own package
Diffstat (limited to 'src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt')
-rw-r--r-- | src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt b/src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt new file mode 100644 index 0000000..b5ce550 --- /dev/null +++ b/src/main/kotlin/moe/nea/ledger/utils/di/DIProvider.kt @@ -0,0 +1,51 @@ +package moe.nea.ledger.utils.di + +import java.lang.reflect.AnnotatedElement +import java.lang.reflect.Constructor + +fun interface DIProvider<T : Any> : BaseDIProvider<T, Unit> { + override fun provideWithContext(di: DI, context: Unit): T { + return provide(di) + } + + override fun createContext(element: AnnotatedElement) { + } + + override fun createEmptyContext() { + } + + fun provide(di: DI): T + + companion object { + + fun <T : Any> fromInjectableClass(clazz: Class<T>): DIProvider<T> { + @Suppress("UNCHECKED_CAST") + val cons = (clazz.constructors.find { it.getAnnotation(Inject::class.java) != null } + ?: clazz.constructors.find { it.parameterCount == 0 } + ?: error("Could not find DI injection entrypoint for class $clazz")) + as Constructor<out T> + return DIProvider { di -> + val typArgs = cons.parameters.map { + di.provide(it.type, it) + }.toTypedArray() + val instance = cons.newInstance(*typArgs) + for (it in clazz.fields) { + if (it.getAnnotation(Inject::class.java) == null) continue + it.set(instance, di.provide(it.type, it)) + } + instance + } + } + + fun <T : Any> singeleton(value: T): DIProvider<T> { + return DIProvider { _ -> value } + } + } + +} + +interface BaseDIProvider<T : Any, C> { + fun createContext(element: AnnotatedElement): C + fun provideWithContext(di: DI, context: C): T + fun createEmptyContext(): C +} |