Scripts/convention/src/main/kotlin/io/gitlab/jfronny/scripts/codegen/ContentGenerator.kt

34 lines
1.7 KiB
Kotlin

package io.gitlab.jfronny.scripts.codegen
import org.gradle.api.Action
import java.util.function.Supplier
class ContentGenerator : Generator<ContentGenerator.Generated>() {
private val classes: MutableMap<String, String> = LinkedHashMap()
private val resources: MutableMap<String, ByteArray> = LinkedHashMap()
override fun generateFinalized() = Generated(ImmutableMap(classes), ImmutableMap(resources))
data class Generated(val classes: Map<String, String>, val resources: Map<String, ByteArray>) {
fun merge(other: Generated): Generated = Generated(classes + other.classes, resources + other.resources)
}
fun `class`(`package`: String, name: String, generator: Action<ClassGenerator>) = ensureMutable {
if (!packagePattern.matches(`package`)) throw IllegalArgumentException("package \"$`package`\" is not a valid package")
if (!classNamePattern.matches(name)) throw IllegalArgumentException("class name \"$name\" is not a valid class name")
val builder = ClassGenerator(`package`, name)
generator.execute(builder)
classes["${`package`.replace('.', '/')}/$name.java"] = builder.finalize()
}
fun text(path: String, generator: Action<StringBuilder>) = ensureMutable {
if (!pathPattern.matches(path)) throw IllegalArgumentException("path \"$path\" is not a valid path")
val builder = StringBuilder()
generator.execute(builder)
resources[path] = builder.toString().toByteArray()
}
fun blob(path: String, generator: Supplier<ByteArray>) = ensureMutable {
if (!pathPattern.matches(path)) throw IllegalArgumentException("path \"$path\" is not a valid path")
resources[path] = generator.get()
}
}