Skip to content

Commit

Permalink
Introduce ArgParseResult
Browse files Browse the repository at this point in the history
We introduce a sealed interface ArgParseResult so we can separate
parsing of arguments and error reporting
  • Loading branch information
Joseph Cooper committed May 13, 2024
1 parent f3a2e54 commit c84f02f
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 13 deletions.
29 changes: 20 additions & 9 deletions core/src/main/java/com/facebook/ktfmt/cli/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ class Main(
private val input: InputStream,
private val out: PrintStream,
private val err: PrintStream,
args: Array<String>
private val args: Array<String>
) {
companion object {
@JvmStatic
Expand Down Expand Up @@ -69,9 +69,13 @@ class Main(
}
}

private val parsedArgs: ParsedArgs = ParsedArgs.processArgs(err, args)


fun run(): Int {
val parsedArgs = when (val argParseResult = ParsedArgs.processArgs(err, args)) {
is ArgParseResult.Ok -> argParseResult.parsedArgs
is ArgParseResult.Error -> exitFatal(argParseResult.errorMessage, 1)
}
if (parsedArgs.fileNames.isEmpty()) {
err.println(
"Usage: ktfmt [--dropbox-style | --google-style | --kotlinlang-style] [--dry-run] [--set-exit-if-changed] [--stdin-name=<name>] [--do-not-remove-unused-imports] File1.kt File2.kt ...")
Expand All @@ -81,7 +85,7 @@ class Main(

if (parsedArgs.fileNames.size == 1 && parsedArgs.fileNames[0] == "-") {
return try {
val alreadyFormatted = format(null)
val alreadyFormatted = format(null,parsedArgs)
if (!alreadyFormatted && parsedArgs.setExitIfChanged) 1 else 0
} catch (e: Exception) {
1
Expand All @@ -107,7 +111,7 @@ class Main(
val retval = AtomicInteger(0)
files.parallelStream().forEach {
try {
if (!format(it) && parsedArgs.setExitIfChanged) {
if (!format(it, parsedArgs) && parsedArgs.setExitIfChanged) {
retval.set(1)
}
} catch (e: Exception) {
Expand All @@ -126,17 +130,17 @@ class Main(
* @param file The file to format. If null, the code is read from <stdin>.
* @return true iff input is valid and already formatted.
*/
private fun format(file: File?): Boolean {
val fileName = file?.toString() ?: parsedArgs.stdinName ?: "<stdin>"
private fun format(file: File?, args: ParsedArgs): Boolean {
val fileName = file?.toString() ?: args.stdinName ?: "<stdin>"
try {
val bytes = if (file == null) input else FileInputStream(file)
val code = BufferedReader(InputStreamReader(bytes, UTF_8)).readText()
val formattedCode = Formatter.format(parsedArgs.formattingOptions, code)
val formattedCode = Formatter.format(args.formattingOptions, code)
val alreadyFormatted = code == formattedCode

// stdin
if (file == null) {
if (parsedArgs.dryRun) {
if (args.dryRun) {
if (!alreadyFormatted) {
out.println(fileName)
}
Expand All @@ -146,7 +150,7 @@ class Main(
return alreadyFormatted
}

if (parsedArgs.dryRun) {
if (args.dryRun) {
if (!alreadyFormatted) {
out.println(fileName)
}
Expand All @@ -173,4 +177,11 @@ class Main(
throw e
}
}

fun exitFatal(message: String, returnCode: Int): Nothing {
err.println(message)
exitProcess(returnCode)
}

}

11 changes: 8 additions & 3 deletions core/src/main/java/com/facebook/ktfmt/cli/ParsedArgs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,11 @@ data class ParsedArgs(
) {
companion object {

fun processArgs(err: PrintStream, args: Array<String>): ParsedArgs {
fun processArgs(err: PrintStream, args: Array<String>): ArgParseResult {
if (args.size == 1 && args[0].startsWith("@")) {
return parseOptions(err, File(args[0].substring(1)).readLines(UTF_8).toTypedArray())
return ArgParseResult.Ok(parseOptions(err, File(args[0].substring(1)).readLines(UTF_8).toTypedArray()))
} else {
return parseOptions(err, args)
return ArgParseResult.Ok(parseOptions(err, args))
}
}

Expand Down Expand Up @@ -90,3 +90,8 @@ data class ParsedArgs(
}
}
}

sealed interface ArgParseResult {
data class Ok(val parsedArgs: ParsedArgs): ArgParseResult
data class Error(val errorMessage: String): ArgParseResult
}
5 changes: 4 additions & 1 deletion core/src/test/java/com/facebook/ktfmt/cli/ParsedArgsTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,10 @@ class ParsedArgsTest {
val file = root.resolve("existing-file")
file.writeText("--google-style\n--dry-run\n--set-exit-if-changed\nFile1.kt\nFile2.kt\n")

val parsed = ParsedArgs.processArgs(PrintStream(out), arrayOf("@" + file.absolutePath))
val result = ParsedArgs.processArgs(PrintStream(out), arrayOf("@" + file.absolutePath))
assertThat(result).isInstanceOf(ArgParseResult.Ok::class.java)

val parsed = (result as ArgParseResult.Ok).parsedArgs

assertThat(parsed.formattingOptions).isEqualTo(Formatter.GOOGLE_FORMAT)
assertThat(parsed.dryRun).isTrue()
Expand Down

0 comments on commit c84f02f

Please sign in to comment.