All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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