element-x-ada/plugins/src/main/kotlin/extension/DependencyInjectionExtensions.kt

55 lines
1.9 KiB
Kotlin

/*
* Copyright (c) 2025 Element Creations Ltd.
* Copyright 2024, 2025 New Vector Ltd.
*
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
* Please see LICENSE files in the repository root for full details.
*/
package extension
import dev.zacsweers.metro.gradle.MetroPluginExtension
import org.gradle.accessors.dm.LibrariesForLibs
import org.gradle.api.Project
import org.gradle.api.provider.Provider
import org.gradle.kotlin.dsl.the
import org.gradle.plugin.use.PluginDependency
/**
* Setup the Metro plugin with the shared configuration.
* @param generateNodeFactories Whether to set up the KSP plugin and dependencies to generate Appyx Node factories.
*/
fun Project.setupDependencyInjection(
generateNodeFactories: Boolean = shouldApplyAppyxCodegen(),
) {
if (project.path.endsWith(":api")) {
error("api module should not use setupDependencyInjection(). Move the implementation to `:impl` module")
}
val libs = the<LibrariesForLibs>()
// Apply Metro plugin and configure it
applyPluginIfNeeded(libs.plugins.metro)
if (generateNodeFactories) {
applyPluginIfNeeded(libs.plugins.ksp)
// Annotations to generate DI code for Appyx nodes
dependencies.implementation(project.project(":annotations"))
// Code generator for the annotations above
dependencies.add("ksp", project.project(":codegen"))
}
}
// These dependencies should only be needed for compose library or application modules
private fun Project.shouldApplyAppyxCodegen(): Boolean {
return project.pluginManager.hasPlugin("io.element.android-compose-library")
|| project.pluginManager.hasPlugin("io.element.android-compose-application")
}
private fun Project.applyPluginIfNeeded(plugin: Provider<PluginDependency>) {
val pluginId = plugin.get().pluginId
if (!pluginManager.hasPlugin(pluginId)) {
pluginManager.apply(pluginId)
}
}