package com.geekorum.build import org.gradle.api.artifacts.ComponentMetadataContext import org.gradle.api.artifacts.ComponentMetadataRule import org.gradle.api.artifacts.Dependency import org.gradle.api.artifacts.dsl.ComponentMetadataHandler import org.gradle.api.artifacts.dsl.DependencyHandler private val componentsPlatform = mutableMapOf>() fun DependencyHandler.createComponentsPlatforms() { components.apply { getOrCreatePlatform(DaggerPlatform) } } private fun ComponentMetadataHandler.getOrCreatePlatform(platformFactory: PlatformFactory): String { val componentsSet = componentsPlatform.getOrPut(this) { mutableSetOf() } if (!componentsSet.contains(platformFactory.platformName)) { componentsSet.add(platformFactory.createPlatform(this)) } return platformFactory.platformName } internal class DaggerPlatform { companion object : PlatformFactory("com.google.dagger:dagger-platform", AlignmentRule::class.java) open class AlignmentRule : SameGroupAlignmentRule(platformName, "com.google.dagger") } fun DependencyHandler.enforcedDaggerPlatform(version: String): Dependency { return enforcedPlatform("${components.getOrCreatePlatform(DaggerPlatform)}:$version") } open class PlatformFactory( internal val platformName: String, private val alignmentRule: Class ) { fun createPlatform(components: ComponentMetadataHandler): String { components.all(alignmentRule) return platformName } } internal open class SameGroupAlignmentRule( private val platformName: String, private val group: String ) : ComponentMetadataRule { override fun execute(ctx: ComponentMetadataContext) { ctx.details.run { if (id.group == group) { belongsTo("$platformName:${id.version}") } } } }