summaryrefslogtreecommitdiff
path: root/runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt')
-rw-r--r--runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt29
1 files changed, 29 insertions, 0 deletions
diff --git a/runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt b/runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt
new file mode 100644
index 00000000..e87a08da
--- /dev/null
+++ b/runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt
@@ -0,0 +1,29 @@
+package kotlinx.serialization.json.internal
+
+import kotlinx.serialization.*
+import kotlin.jvm.*
+
+internal enum class WriteMode(@JvmField val begin: Char, @JvmField val end: Char) {
+ OBJ(BEGIN_OBJ, END_OBJ),
+ LIST(BEGIN_LIST, END_LIST),
+ MAP(BEGIN_OBJ, END_OBJ),
+ POLY_OBJ(BEGIN_LIST, END_LIST);
+
+ @JvmField
+ val beginTc: Byte = charToTokenClass(begin)
+ @JvmField
+ val endTc: Byte = charToTokenClass(end)
+}
+
+internal fun switchMode(desc: SerialDescriptor, typeParams: Array<out KSerializer<*>>): WriteMode =
+ when (desc.kind) {
+ UnionKind.POLYMORPHIC -> WriteMode.POLY_OBJ
+ StructureKind.LIST -> WriteMode.LIST
+ StructureKind.MAP -> {
+ val keyKind = typeParams[0].descriptor.kind
+ if (keyKind is PrimitiveKind || keyKind == UnionKind.ENUM_KIND)
+ WriteMode.MAP
+ else WriteMode.LIST
+ }
+ else -> WriteMode.OBJ
+ }