package io.gitlab.jfronny.lom.ext import org.gradle.api.Action import org.gradle.api.DefaultTask import org.gradle.api.PolymorphicDomainObjectContainer import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.publish.PublishingExtension import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.bundling.Jar import org.gradle.kotlin.dsl.named import org.gradle.kotlin.dsl.support.delegates.ProjectDelegate import org.gradle.language.jvm.tasks.ProcessResources import kotlin.reflect.KClass import kotlin.reflect.KProperty val Project.java: JavaPluginExtension get() = extensions.getByName("java") as JavaPluginExtension fun Project.java(configure: Action) = extensions.configure("java", configure) val Project.publishing: PublishingExtension get() = extensions.getByName("publishing") as PublishingExtension fun Project.publishing(configure: Action) = extensions.configure("publishing", configure) val Project.sourceSets: SourceSetContainer get() = extensions.getByName("sourceSets") as SourceSetContainer fun Project.sourceSets(configure: Action) = extensions.configure("sourceSets", configure) val TaskContainer.assemble: DefaultTask get() = named("assemble").get() val TaskContainer.build: DefaultTask get() = named("build").get() val TaskContainer.jar: Jar get() = named("jar").get() val TaskContainer.sourcesJar: Jar get() = named("sourcesJar").get() val TaskContainer.publish: Task get() = named("publish").get() fun TaskContainer.processResources(configure: ProcessResources.() -> Unit) = named("processResources").configure(configure) fun , U : T> C.registering(type: KClass, action: U.() -> Unit): PDelegate = PDelegate(this, type.java, action) class PDelegate, U : T>(private val container: C, private val type: Class, private val action: U.() -> Unit) { operator fun provideDelegate(thisRef: Any?, property: KProperty<*>): SDelegate = SDelegate(container.register(property.name, type, action).get()) } class SDelegate(private val delegate: T) { operator fun getValue(thisRef: Any?, property: KProperty<*>): T = delegate } fun Project.prop(name: String, default: String? = null): String { return if (default == null || hasProperty(name)) property(name).toString() else default }