1 /* 2 * Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 5 @file:OptIn(ExperimentalSerializationApi::class) 6 package kotlinx.serialization.json.internal 7 8 import kotlinx.serialization.* 9 import kotlinx.serialization.json.* 10 import kotlin.jvm.* 11 Composernull12internal fun Composer(sb: InternalJsonWriter, json: Json): Composer = 13 if (json.configuration.prettyPrint) ComposerWithPrettyPrint(sb, json) else Composer(sb) 14 15 @OptIn(ExperimentalSerializationApi::class) 16 internal open class Composer(@JvmField internal val writer: InternalJsonWriter) { 17 var writingFirst = true 18 protected set 19 20 open fun indent() { 21 writingFirst = true 22 } 23 24 open fun unIndent() = Unit 25 26 open fun nextItem() { 27 writingFirst = false 28 } 29 30 open fun nextItemIfNotFirst() { 31 writingFirst = false 32 } 33 34 open fun space() = Unit 35 36 fun print(v: Char) = writer.writeChar(v) 37 fun print(v: String) = writer.write(v) 38 open fun print(v: Float) = writer.write(v.toString()) 39 open fun print(v: Double) = writer.write(v.toString()) 40 open fun print(v: Byte) = writer.writeLong(v.toLong()) 41 open fun print(v: Short) = writer.writeLong(v.toLong()) 42 open fun print(v: Int) = writer.writeLong(v.toLong()) 43 open fun print(v: Long) = writer.writeLong(v) 44 open fun print(v: Boolean) = writer.write(v.toString()) 45 open fun printQuoted(value: String) = writer.writeQuoted(value) 46 } 47 48 @SuppressAnimalSniffer // Long(Integer).toUnsignedString(long) 49 internal class ComposerForUnsignedNumbers(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) { printnull50 override fun print(v: Int) { 51 if (forceQuoting) printQuoted(v.toUInt().toString()) else print(v.toUInt().toString()) 52 } 53 printnull54 override fun print(v: Long) { 55 if (forceQuoting) printQuoted(v.toULong().toString()) else print(v.toULong().toString()) 56 } 57 printnull58 override fun print(v: Byte) { 59 if (forceQuoting) printQuoted(v.toUByte().toString()) else print(v.toUByte().toString()) 60 } 61 printnull62 override fun print(v: Short) { 63 if (forceQuoting) printQuoted(v.toUShort().toString()) else print(v.toUShort().toString()) 64 } 65 } 66 67 @SuppressAnimalSniffer 68 internal class ComposerForUnquotedLiterals(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) { printQuotednull69 override fun printQuoted(value: String) { 70 if (forceQuoting) super.printQuoted(value) else super.print(value) 71 } 72 } 73 74 internal class ComposerWithPrettyPrint( 75 writer: InternalJsonWriter, 76 private val json: Json 77 ) : Composer(writer) { 78 private var level = 0 79 indentnull80 override fun indent() { 81 writingFirst = true 82 level++ 83 } 84 unIndentnull85 override fun unIndent() { 86 level-- 87 } 88 nextItemnull89 override fun nextItem() { 90 writingFirst = false 91 print("\n") 92 repeat(level) { print(json.configuration.prettyPrintIndent) } 93 } 94 nextItemIfNotFirstnull95 override fun nextItemIfNotFirst() { 96 if (writingFirst) writingFirst = false 97 else nextItem() 98 } 99 spacenull100 override fun space() { 101 print(' ') 102 } 103 } 104