diff --git a/core/src/main/java/com/facebook/ktfmt/cli/Main.kt b/core/src/main/java/com/facebook/ktfmt/cli/Main.kt index a3a6104a..36eeb784 100644 --- a/core/src/main/java/com/facebook/ktfmt/cli/Main.kt +++ b/core/src/main/java/com/facebook/ktfmt/cli/Main.kt @@ -74,7 +74,7 @@ class Main( } if (parsedArgs.fileNames.isEmpty()) { err.println( - "Usage: ktfmt [--dropbox-style | --google-style | --kotlinlang-style] [--dry-run] [--set-exit-if-changed] [--stdin-name=] [--do-not-remove-unused-imports] File1.kt File2.kt ...") + "Usage: ktfmt [--style=dropbox|google|kotlinlang] [--dry-run] [--set-exit-if-changed] [--stdin-name=] [--do-not-remove-unused-imports] File1.kt File2.kt ...") err.println("Or: ktfmt @file") return 1 } @@ -92,7 +92,7 @@ class Main( } val files: List = expandArgsToFileNames(parsedArgs.fileNames) - + if (files.isEmpty()) { err.println("Error: no .kt files found") return 1 diff --git a/core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt b/core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt index d37b3bb6..1287d5a2 100644 --- a/core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt +++ b/core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt @@ -59,9 +59,21 @@ data class ParsedArgs( for (arg in args) { when { - arg == "--dropbox-style" -> formattingOptions = Formatter.DROPBOX_FORMAT - arg == "--google-style" -> formattingOptions = Formatter.GOOGLE_FORMAT - arg == "--kotlinlang-style" -> formattingOptions = Formatter.KOTLINLANG_FORMAT + arg.startsWith("--style=") -> { + val parsedStyle = + parseKeyValueArg("--style", arg) + ?: return ParseResult.Error( + unexpectedArg(arg) + ) + formattingOptions = when (parsedStyle) { + "dropbox" -> Formatter.DROPBOX_FORMAT + "google" -> Formatter.GOOGLE_FORMAT + "kotlinlang" -> Formatter.KOTLINLANG_FORMAT + else -> return ParseResult.Error( + "Unknown style '${parsedStyle}'. Style must be one of [dropbox, google, kotlinlang]." + ) + } + } arg == "--dry-run" || arg == "-n" -> dryRun = true arg == "--set-exit-if-changed" -> setExitIfChanged = true arg == "--do-not-remove-unused-imports" -> removeUnusedImports = false @@ -70,8 +82,8 @@ data class ParsedArgs( parseKeyValueArg("--stdin-name", arg) ?: return ParseResult.Error( "Found option '${arg}', expected '${"--stdin-name"}='") - arg.startsWith("--") -> return ParseResult.Error("Unexpected option: $arg") - arg.startsWith("@") -> return ParseResult.Error("Unexpected option: $arg") + arg.startsWith("--") -> return ParseResult.Error(unexpectedArg(arg)) + arg.startsWith("@") -> return ParseResult.Error(unexpectedArg(arg)) else -> fileNames.add(arg) } } @@ -94,6 +106,8 @@ data class ParsedArgs( )) } + private fun unexpectedArg(arg: String) = "Unexpected option: $arg" + private fun parseKeyValueArg(key: String, arg: String): String? { val parts = arg.split('=', limit = 2) return parts[1].takeIf { parts[0] == key || parts.size == 2 } diff --git a/core/src/test/java/com/facebook/ktfmt/cli/MainTest.kt b/core/src/test/java/com/facebook/ktfmt/cli/MainTest.kt index 5c046db8..fb347dcc 100644 --- a/core/src/test/java/com/facebook/ktfmt/cli/MainTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/cli/MainTest.kt @@ -244,7 +244,7 @@ class MainTest { emptyInput, PrintStream(out), PrintStream(err), - arrayOf("--dropbox-style", fooBar.toString())) + arrayOf("--style=dropbox", fooBar.toString())) .run() assertThat(fooBar.readText()).isEqualTo(code) @@ -274,7 +274,7 @@ class MainTest { code.byteInputStream(), PrintStream(out), PrintStream(err), - arrayOf("--dropbox-style", "-")) + arrayOf("--style=dropbox", "-")) .run() assertThat(out.toString(UTF_8)).isEqualTo(formatted) diff --git a/core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt b/core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt index 2e019014..7b810fbd 100644 --- a/core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt +++ b/core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt @@ -61,17 +61,29 @@ class ParsedArgsTest { } @Test - fun `parseOptions recognizes --dropbox-style`() { - val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--dropbox-style", "foo.kt"))) + fun `parseOptions recognizes --style=dropbox`() { + val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=dropbox", "foo.kt"))) assertThat(parsed.formattingOptions).isEqualTo(Formatter.DROPBOX_FORMAT) } @Test - fun `parseOptions recognizes --google-style`() { - val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--google-style", "foo.kt"))) + fun `parseOptions recognizes --style=google`() { + val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=google", "foo.kt"))) assertThat(parsed.formattingOptions).isEqualTo(Formatter.GOOGLE_FORMAT) } + @Test + fun `parseOptions recognizes --style=kotlinlang`() { + val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--style=kotlinlang", "foo.kt"))) + assertThat(parsed.formattingOptions).isEqualTo(Formatter.KOTLINLANG_FORMAT) + } + + @Test + fun `parseOptions rejects unknown style`() { + val parseResult = ParsedArgs.parseOptions(arrayOf("--style=custom-style", "foo.kt")) + assertThat(parseResult).isInstanceOf(ParseResult.Error::class.java) + } + @Test fun `parseOptions recognizes --dry-run`() { val parsed = assertSucceeds(ParsedArgs.parseOptions(arrayOf("--dry-run", "foo.kt"))) @@ -139,7 +151,7 @@ class ParsedArgsTest { @Test fun `processArgs use the @file option with file containing arguments`() { val file = root.resolve("existing-file") - file.writeText("--google-style\n--dry-run\n--set-exit-if-changed\nFile1.kt\nFile2.kt\n") + file.writeText("--style=google\n--dry-run\n--set-exit-if-changed\nFile1.kt\nFile2.kt\n") val result = ParsedArgs.processArgs(arrayOf("@" + file.absolutePath)) assertThat(result).isInstanceOf(ParseResult.Ok::class.java) @@ -156,7 +168,7 @@ class ParsedArgsTest { fun `parses multiple args successfully`() { val testResult = ParsedArgs.parseOptions( - arrayOf("--google-style", "--dry-run", "--set-exit-if-changed", "File.kt"), + arrayOf("--style=google", "--dry-run", "--set-exit-if-changed", "File.kt"), ) assertThat(testResult) .isEqualTo( @@ -171,7 +183,7 @@ class ParsedArgsTest { @Test fun `last style in args wins`() { val testResult = - ParsedArgs.parseOptions(arrayOf("--google-style", "--dropbox-style", "File.kt")) + ParsedArgs.parseOptions(arrayOf("--style=google", "--style=dropbox", "File.kt")) assertThat(testResult) .isEqualTo( parseResultOk(