diff --git a/config.toml b/config.toml index d422a1a..bcf3be9 100644 --- a/config.toml +++ b/config.toml @@ -16,6 +16,15 @@ display = "Java Version" default = "1.4.10" display = "Kotlin Version" +[repositories] + +[repositories.jcenter] +url = "https://jcenter.bintray.com" +default = true # TODO: find where this is needed + +[repositories.arrow] +url = "https://dl.bintray.com/arrow-kt/arrow-kt/" + [dependencies] [dependencies.http4k] @@ -166,3 +175,9 @@ groupId = "org.jetbrains.kotlinx" artifactId = "kotlinx-serialization-runtime" version = "1.0-M1-1.4.0-rc" category = "serialization" + +[dependencies.Arrow-core] +groupId = "io.arrow-kt" +artifactId = "arrow-core" +version = "0.10.5" +repository = "arrow" diff --git a/src/main/kotlin/starter/Config.kt b/src/main/kotlin/starter/Config.kt index ad38550..c116981 100644 --- a/src/main/kotlin/starter/Config.kt +++ b/src/main/kotlin/starter/Config.kt @@ -3,34 +3,47 @@ package starter import com.electronwill.nightconfig.core.file.FileConfig import com.electronwill.nightconfig.core.Config as NightConfig -data class StarterConfig(val dependencies: List, val inputs: List) +data class StarterConfig( + val dependencies: List, + val inputs: List, + val repositories: List, +) class Config { + + @Suppress("UNCHECKED_CAST") + private fun FileConfig.configMap(key: String) = this.get(key).valueMap() as Map + fun load(): StarterConfig { val cfg = FileConfig.of("config.toml") cfg.load() - val dependenciesNode: NightConfig = cfg["dependencies"] - @Suppress("UNCHECKED_CAST") val dependenciesMap = dependenciesNode.valueMap() as Map - val dependencies = dependenciesMap.map { (name, values) -> - Dependency( - name, - values["groupId"], - values["artifactId"], - values["version"], - values.getOrElse("default", false), - values.getEnumOrElse("category", Category.Other), - values.getEnumOrElse("scope", Scope.Compile), - values["logger"], - ) - } - val inputsNode: NightConfig = cfg["inputs"] - @Suppress("UNCHECKED_CAST") val inputMap = inputsNode.valueMap() as Map - val inputs = inputMap.map { (name, values) -> - Input(name, values["display"], values["default"]) - } + val dependencies = cfg.configMap("dependencies") + .map { (name, values) -> + Dependency( + name, + values["groupId"], + values["artifactId"], + values["version"], + values.getOrElse("default", false), + values.getEnumOrElse("category", Category.Other), + values.getEnumOrElse("scope", Scope.Compile), + values["logger"], + values["repository"], + ) + } - return StarterConfig(dependencies, inputs) + val inputs = cfg.configMap("inputs") + .map { (name, values) -> + Input(name, values["display"], values["default"]) + } + + val repositories = cfg.configMap("repositories") + .map { (name, values) -> + Repository(name, values["url"], values.getOrElse("default", false)) + } + + return StarterConfig(dependencies, inputs, repositories) } } diff --git a/src/main/kotlin/starter/Models.kt b/src/main/kotlin/starter/Models.kt index 70e0dba..57fee7d 100644 --- a/src/main/kotlin/starter/Models.kt +++ b/src/main/kotlin/starter/Models.kt @@ -17,8 +17,11 @@ data class Dependency( val category: Category, val scope: Scope, val logger: String?, + val repository: String?, ) +data class Repository(val name: String, val url: String, val default: Boolean) + data class Input(val name: String, val display: String, val value: String? = null) data class Project( @@ -26,4 +29,5 @@ data class Project( val basePackage: String, val inputs: List, val dependencies: List, + val repositories: List, ) diff --git a/src/main/kotlin/starter/Server.kt b/src/main/kotlin/starter/Server.kt index b3203b2..748dc58 100644 --- a/src/main/kotlin/starter/Server.kt +++ b/src/main/kotlin/starter/Server.kt @@ -40,7 +40,10 @@ class Server( return@post } - val project = Project(projectName, basePackage, inputs, deps) + val repositories = conf.repositories + .filter { repo -> repo.default || repo.name in deps.mapNotNull { it.repository } } + + val project = Project(projectName, basePackage, inputs, deps, repositories) ctx.contentType("application/zip") ctx.header("Content-Disposition", "attachment; filename=\"${sanitizeFilename(projectName)}.zip\"") diff --git a/src/main/kotlin/starter/templates/PomTemplate.kt b/src/main/kotlin/starter/templates/PomTemplate.kt index f4eb6cd..64fc55c 100644 --- a/src/main/kotlin/starter/templates/PomTemplate.kt +++ b/src/main/kotlin/starter/templates/PomTemplate.kt @@ -11,6 +11,7 @@ class PomTemplate(private val engine: PebbleEngine) : Template { override fun render(project: Project): String { val args: MutableMap = mutableMapOf( "dependencies" to project.dependencies.sortedBy { it.scope }, + "repositories" to project.repositories, "kotlinxSerialization" to project.dependencies.any { it.name == "Kotlinx-serialization" }, ) diff --git a/src/main/resources/starter/pom/@repositories.twig b/src/main/resources/starter/pom/@repositories.twig index 649f745..d954ee0 100644 --- a/src/main/resources/starter/pom/@repositories.twig +++ b/src/main/resources/starter/pom/@repositories.twig @@ -1,7 +1,8 @@ - - jcenter - jcenter - https://jcenter.bintray.com - - \ No newline at end of file + {% for repo in repositories %} + + {{ repo.name }} + {{ repo.url }} + + {% endfor %} +