summaryrefslogtreecommitdiff
path: root/formats/json/commonMain/src/kotlinx/serialization/json/internal/Composers.kt
diff options
context:
space:
mode:
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.kt64
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(' ')
}