class KotlinDataClassFormatter : Formatter { override fun call(value: T): String { return prettyPrint(value.toString()) } private fun prettyPrint(string: String): String { val builder = StringBuilder() var indent = 0 var inString = false for (char in string) { if (!inString && char in LITERAL_STRING_TOKENS) { inString = true } else if (inString && char in LITERAL_STRING_TOKENS) { inString = false } if (!inString && char in INDENT_START_TOKENS) { indent++ } if (!inString && char in LINE_BREAK_TOKENS) { builder.append('\n') } if (!inString && char in INDENT_END_TOKENS) { indent-- } builder.append("\t".repeat(indent)) builder.append(char) } return builder.toString() } companion object { val INDENT_START_TOKENS = charArrayOf('(', '{', ',') val INDENT_END_TOKENS = charArrayOf(')', '}') val LINE_BREAK_TOKENS = charArrayOf('(') val LITERAL_STRING_TOKENS = charArrayOf('"', '\'') } }