diff options
Diffstat (limited to 'runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt')
-rw-r--r-- | runtime/commonMain/src/kotlinx/serialization/json/internal/WriteMode.kt | 29 |
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 + } |