@@ -46,11 +46,12 @@ import scala.annotation.tailrec
46
46
*/
47
47
final private [borer] class JsonRenderer (var out : Output , indent : Int ) extends Renderer :
48
48
49
- private [this ] var level : Int = _ // valid range: 0 - 63
50
- private [this ] var levelType : Long = _ // keeps the type of each level as a bit map: 0 -> Array, 1 -> Map
51
- private [this ] var levelCount : Long = _ // for each level: last bit of element count
52
- private [this ] var sepRequired : Boolean = _ // whether a separator required before the next element
53
- private [this ] var currentIndent : Int = _ // the number of space chars to indent with at the current level
49
+ private [this ] var level : Int = _ // valid range: 0 - 63
50
+ private [this ] var levelType : Long = _ // keeps the type of each level as a bit map: 0 -> Array, 1 -> Map
51
+ private [this ] var levelCount : Long = _ // for each level: last bit of element count
52
+ private [this ] var sepRequired : Boolean = _ // whether a separator is required before the next element
53
+ private [this ] var currentIndent : Int = _ // the number of space chars to indent with at the current level
54
+ private [this ] var indentPending : Boolean = _ // true if the next array or map element must be prefixed with an indent
54
55
55
56
def onNull (): Unit =
56
57
if (isNotMapKey)
@@ -213,7 +214,7 @@ final private[borer] class JsonRenderer(var out: Output, indent: Int) extends Re
213
214
sepRequired = false
214
215
else o.failUnsupported(" more than 64 JSON Array/Object nesting levels" )
215
216
currentIndent += indent
216
- if (currentIndent > 0 ) o.writeAndIndent ('[' ) else o.writeAsByte('[' )
217
+ if (currentIndent > 0 ) o.writeAndMarkIndentPending ('[' ) else o.writeAsByte('[' )
217
218
else out.failCannotBeMapKey(" arrays" )
218
219
219
220
def onMapHeader (length : Long ): Unit =
@@ -229,7 +230,7 @@ final private[borer] class JsonRenderer(var out: Output, indent: Int) extends Re
229
230
sepRequired = false
230
231
else o.failUnsupported(" more than 64 JSON Array/Object nesting levels" )
231
232
currentIndent += indent
232
- if (currentIndent > 0 ) o.writeAndIndent ('{' ) else o.writeAsByte('{' )
233
+ if (currentIndent > 0 ) o.writeAndMarkIndentPending ('{' ) else o.writeAsByte('{' )
233
234
else out.failCannotBeMapKey(" maps" )
234
235
235
236
def onBreak (): Unit =
@@ -240,7 +241,7 @@ final private[borer] class JsonRenderer(var out: Output, indent: Int) extends Re
240
241
levelCount >>>= 1
241
242
currentIndent -= indent
242
243
else out.failValidation(" Received BREAK without corresponding ArrayStart or MapStart" )
243
- val o = if (indent > 0 ) out.writeAsByte('\n ' ).writeIndent() else out
244
+ val o = if (indent > 0 && ! indentPending ) out.writeAsByte('\n ' ).writeIndent() else out
244
245
out = o.writeAsByte(c).count() // level-entering items are only counted when the level is exited, not when entered
245
246
246
247
def onTag (value : Tag ): Unit = out.failUnsupported(" CBOR tags" )
@@ -266,13 +267,21 @@ final private[borer] class JsonRenderer(var out: Output, indent: Int) extends Re
266
267
(',' .toInt + ((':' .toInt - ',' .toInt) & ~ ((levelType.toInt & levelCount.toInt & 1 ) - 1 ))).toByte
267
268
)
268
269
} else writeSepIndented()
269
- } else out
270
+ } else if (indent > 0 && indentPending) writePendingIndent()
271
+ else out
270
272
271
273
private def writeSepIndented (): Output =
272
- if ((levelType & levelCount & 1 ) == 0 ) out.writeAndIndent(',' ) else out.writeAsBytes(':' , ' ' )
274
+ if ((levelType & levelCount & 1 ) == 0 ) {
275
+ out.writeAsBytes(',' , '\n ' ).writeIndent()
276
+ } else out.writeAsBytes(':' , ' ' )
277
+
278
+ private def writeAndMarkIndentPending (c : Char ): Output =
279
+ indentPending = true
280
+ out.writeAsByte(c)
273
281
274
- private def writeAndIndent (c : Char ): Output =
275
- out.writeAsBytes(c, '\n ' ).writeIndent()
282
+ private def writePendingIndent (): Output =
283
+ indentPending = false
284
+ out.writeAsByte('\n ' ).writeIndent()
276
285
277
286
private def writeIndent (): Output =
278
287
var o : Output = out
0 commit comments