diff options
Diffstat (limited to 'formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt')
-rw-r--r-- | formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt | 64 |
1 files changed, 40 insertions, 24 deletions
diff --git a/formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt b/formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt index 2bc080f9..abdd1c44 100644 --- a/formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt +++ b/formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt @@ -1,19 +1,19 @@ /* - * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. + * Copyright 2017-2022 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. */ @file:OptIn(ExperimentalSerializationApi::class) package kotlinx.serialization.json.internal -import kotlinx.serialization.ExperimentalSerializationApi -import kotlinx.serialization.json.Json -import kotlin.jvm.JvmField +import kotlinx.serialization.* +import kotlinx.serialization.json.* +import kotlin.jvm.* -internal fun Composer(sb: JsonStringBuilder, json: Json): Composer = +internal fun Composer(sb: InternalJsonWriter, json: Json): Composer = if (json.configuration.prettyPrint) ComposerWithPrettyPrint(sb, json) else Composer(sb) @OptIn(ExperimentalSerializationApi::class) -internal open class Composer(@JvmField internal val sb: JsonStringBuilder) { +internal open class Composer(@JvmField internal val writer: InternalJsonWriter) { var writingFirst = true protected set @@ -27,43 +27,54 @@ internal open class Composer(@JvmField internal val sb: JsonStringBuilder) { writingFirst = false } + open fun nextItemIfNotFirst() { + writingFirst = false + } + open fun space() = Unit - fun print(v: Char) = sb.append(v) - fun print(v: String) = sb.append(v) - open fun print(v: Float) = sb.append(v.toString()) - open fun print(v: Double) = sb.append(v.toString()) - open fun print(v: Byte) = sb.append(v.toLong()) - open fun print(v: Short) = sb.append(v.toLong()) - open fun print(v: Int) = sb.append(v.toLong()) - open fun print(v: Long) = sb.append(v) - open fun print(v: Boolean) = sb.append(v.toString()) - fun printQuoted(value: String): Unit = sb.appendQuoted(value) + fun print(v: Char) = writer.writeChar(v) + fun print(v: String) = writer.write(v) + open fun print(v: Float) = writer.write(v.toString()) + open fun print(v: Double) = writer.write(v.toString()) + open fun print(v: Byte) = writer.writeLong(v.toLong()) + open fun print(v: Short) = writer.writeLong(v.toLong()) + open fun print(v: Int) = writer.writeLong(v.toLong()) + open fun print(v: Long) = writer.writeLong(v) + open fun print(v: Boolean) = writer.write(v.toString()) + open fun printQuoted(value: String) = writer.writeQuoted(value) } -@ExperimentalUnsignedTypes -internal class ComposerForUnsignedNumbers(sb: JsonStringBuilder) : Composer(sb) { +@SuppressAnimalSniffer // Long(Integer).toUnsignedString(long) +internal class ComposerForUnsignedNumbers(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) { override fun print(v: Int) { - return super.print(v.toUInt().toString()) + if (forceQuoting) printQuoted(v.toUInt().toString()) else print(v.toUInt().toString()) } override fun print(v: Long) { - return super.print(v.toULong().toString()) + if (forceQuoting) printQuoted(v.toULong().toString()) else print(v.toULong().toString()) } override fun print(v: Byte) { - return super.print(v.toUByte().toString()) + if (forceQuoting) printQuoted(v.toUByte().toString()) else print(v.toUByte().toString()) } override fun print(v: Short) { - return super.print(v.toUShort().toString()) + if (forceQuoting) printQuoted(v.toUShort().toString()) else print(v.toUShort().toString()) + } +} + +@SuppressAnimalSniffer +internal class ComposerForUnquotedLiterals(writer: InternalJsonWriter, private val forceQuoting: Boolean) : Composer(writer) { + override fun printQuoted(value: String) { + if (forceQuoting) super.printQuoted(value) else super.print(value) } } internal class ComposerWithPrettyPrint( - sb: JsonStringBuilder, + writer: InternalJsonWriter, private val json: Json -) : Composer(sb) { +) : Composer(writer) { private var level = 0 override fun indent() { @@ -81,6 +92,11 @@ internal class ComposerWithPrettyPrint( repeat(level) { print(json.configuration.prettyPrintIndent) } } + override fun nextItemIfNotFirst() { + if (writingFirst) writingFirst = false + else nextItem() + } + override fun space() { print(' ') } |