
tech.skot.tools.starter.ModuleGenerator.kt Maven / Gradle / Ivy
package tech.skot.tools.starter
import com.squareup.kotlinpoet.ClassName
import tech.skot.tools.generation.writeLinesTo
import java.nio.file.Files
import java.nio.file.Path
class ModuleGenerator(
val name: String,
val configuration: StarterConfiguration,
val rootDir: Path
) {
companion object {
const val activityTemplateSimple = """
"""
const val activityTemplateRoot = """
"""
}
private val buildGradle = BuildGradleGenerator()
fun buildGradle(block: BuildGradleGenerator.() -> Unit) {
buildGradle.block()
}
var mainPackage: String? = null
var justAndroid: Boolean = false
var androidApplicationClass: String? = null
fun buildDir(relativePath: String) {
Files.createDirectories(rootDir.resolve(relativePath))
}
var androidPackage: String? = null
fun android(packageName: String) {
androidPackage = packageName
}
var androidAppTheme: String? = null
fun androidAppTheme(appTheme: String) {
androidAppTheme = appTheme
}
var appName: String? = null
data class Activity(val className: ClassName, val template: String, val theme: String)
var androidActivities: List? = null
var androidStrings = mutableMapOf()
fun androidString(key: String, value: String) {
androidStrings[key] = value
}
var androidPermissions = mutableListOf()
fun androidPermission(permission: String) {
androidPermissions.add(permission)
}
fun generate() {
rootDir.writeLinesTo("$name/build.gradle.kts", buildGradle.generate())
val main = if (justAndroid) "androidMain" else "commonMain"
mainPackage?.let { buildDir("$name/src/$main/kotlin/${it.replace(".", "/")}") }
androidPackage?.let {
println("------generate manifest")
val applicationOpenTag: List = when {
androidApplicationClass != null -> {
listOf("\t()) +
(appName?.let { listOf("\t\tandroid:label=\"$it\"") }
?: emptyList()) +
"\t\t>"
}
!androidActivities.isNullOrEmpty() -> {
listOf("\t")
}
else -> emptyList()
}
val applicationCloseTag = when {
androidApplicationClass != null || !androidActivities.isNullOrEmpty() -> {
listOf("\t ")
}
else -> emptyList()
}
rootDir.writeLinesTo("$name/src/androidMain/AndroidManifest.xml", listOfNotNull(
"",
""
) +
androidPermissions.map { "\t " } +
applicationOpenTag +
(androidActivities?.flatMap { activity ->
activity.template.format(
activity.className.canonicalName,
activity.theme
).split("\n")
} ?: emptyList()) +
applicationCloseTag +
" "
)
}
if (androidStrings.isNotEmpty()) {
println("------ generate strings")
rootDir.writeLinesTo("$name/src/androidMain/res/values/strings.xml",
listOf("", "")
+ androidStrings.map { "\t\"${it.value}\" " }
+ " "
)
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy