From 88554f92bb5ef43ef6f08fe57f1914f7585b9ff7 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Mon, 7 Sep 2026 10:19:30 -0700 Subject: [PATCH] fix: refactor android feature validation to isolate cli errors from requ --- .../cli/GenerateProjectRequest.kt | 11 ++-- .../github/cdsap/projectgenerator/cli/Main.kt | 53 ++++++++++--------- .../cli/GenerateProjectsCliTest.kt | 4 +- 3 files changed, 39 insertions(+), 29 deletions(-) diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt index 9e65e3a0..da8ecd55 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt @@ -1,6 +1,5 @@ package io.github.cdsap.projectgenerator.cli -import com.github.ajalt.clikt.core.UsageError import io.github.cdsap.projectgenerator.ProjectGenerator import io.github.cdsap.projectgenerator.model.ClassesPerModule import io.github.cdsap.projectgenerator.model.Gradle @@ -94,16 +93,22 @@ data class GenerateProjectRequest( } } +internal class GenerateProjectRequestValidationException( + message: String +) : RuntimeException(message) + internal fun validateAndroidOnlyFeatures( typeOfProjectRequested: TypeProjectRequested, roomDatabase: Boolean, kotlinMultiplatformLibrary: Boolean ) { if (typeOfProjectRequested != TypeProjectRequested.ANDROID && roomDatabase) { - throw UsageError("--room-database is only available when --type android.") + throw GenerateProjectRequestValidationException("--room-database is only available when --type android.") } if (typeOfProjectRequested != TypeProjectRequested.ANDROID && kotlinMultiplatformLibrary) { - throw UsageError("--android-kotlin-multiplatform-library is only available when --type android.") + throw GenerateProjectRequestValidationException( + "--android-kotlin-multiplatform-library is only available when --type android." + ) } } diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt index 9a055cc4..4c85fbb9 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/Main.kt @@ -1,6 +1,7 @@ package io.github.cdsap.projectgenerator.cli import com.github.ajalt.clikt.core.CliktCommand +import com.github.ajalt.clikt.core.UsageError import com.github.ajalt.clikt.core.main import com.github.ajalt.clikt.core.subcommands import com.github.ajalt.clikt.parameters.options.* @@ -55,30 +56,34 @@ class GenerateProjects : CliktCommand(name = "generate-project") { private val kotlinMultiplatformLibrary by option("--android-kotlin-multiplatform-library").flag(default = false) override fun run() { - GenerateProjectRequest.resolve( - modules = modules, - shape = Shape.valueOf(shape.uppercase()), - language = Language.valueOf(language.uppercase()), - typeOfProjectRequested = TypeProjectRequested.valueOf(type.uppercase()), - classesPerModule = ClassesPerModule( - ClassesPerModuleType.valueOf(classesModuleType.uppercase()), - classesModule - ), - typeOfStringResources = TypeOfStringResources.valueOf(typeOfStringResources.uppercase()), - layers = layers, - generateUnitTest = generateUnitTest, - cliGradle = gradle, - develocityFlag = develocity, - versionsFile = versionsFile?.let(VersionsParser::fromFile), - outputDir = outputDir, - projectName = projectName, - versionsOverrides = VersionsOverrides( - dependencyInjection = DependencyInjection.valueOf(di.uppercase()), - develocityUrl = develocityUrl, - roomDatabase = roomDatabase, - kotlinMultiplatformLibrary = kotlinMultiplatformLibrary - ) - ).toProjectGenerator().write() + try { + GenerateProjectRequest.resolve( + modules = modules, + shape = Shape.valueOf(shape.uppercase()), + language = Language.valueOf(language.uppercase()), + typeOfProjectRequested = TypeProjectRequested.valueOf(type.uppercase()), + classesPerModule = ClassesPerModule( + ClassesPerModuleType.valueOf(classesModuleType.uppercase()), + classesModule + ), + typeOfStringResources = TypeOfStringResources.valueOf(typeOfStringResources.uppercase()), + layers = layers, + generateUnitTest = generateUnitTest, + cliGradle = gradle, + develocityFlag = develocity, + versionsFile = versionsFile?.let(VersionsParser::fromFile), + outputDir = outputDir, + projectName = projectName, + versionsOverrides = VersionsOverrides( + dependencyInjection = DependencyInjection.valueOf(di.uppercase()), + develocityUrl = develocityUrl, + roomDatabase = roomDatabase, + kotlinMultiplatformLibrary = kotlinMultiplatformLibrary + ) + ).toProjectGenerator().write() + } catch (e: GenerateProjectRequestValidationException) { + throw UsageError(e.message ?: "Invalid generate-project request.") + } } } diff --git a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt index 8ba19fd9..e6c3eae7 100644 --- a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt +++ b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt @@ -51,7 +51,7 @@ class GenerateProjectsCliTest { @Test fun `resolve rejects room database for jvm type`() { - val error = assertThrows { + val error = assertThrows { GenerateProjectRequest.resolve( modules = 6, shape = Shape.RECTANGLE, @@ -79,7 +79,7 @@ class GenerateProjectsCliTest { @Test fun `resolve rejects android kotlin multiplatform library for jvm type`() { - val error = assertThrows { + val error = assertThrows { GenerateProjectRequest.resolve( modules = 6, shape = Shape.RECTANGLE,