@@ -12,10 +12,85 @@ package com.mifos.core.model.objects.runreport
1212import com.mifos.core.model.utils.Parcelable
1313import com.mifos.core.model.utils.Parcelize
1414import kotlinx.serialization.Serializable
15+ import kotlinx.serialization.ExperimentalSerializationApi
16+ import kotlinx.serialization.KSerializer
17+ import kotlinx.serialization.SerializationException
18+ import kotlinx.serialization.builtins.ListSerializer
19+ import kotlinx.serialization.builtins.nullable
20+ import kotlinx.serialization.builtins.serializer
21+ import kotlinx.serialization.descriptors.SerialDescriptor
22+ import kotlinx.serialization.descriptors.mapSerialDescriptor
23+ import kotlinx.serialization.encoding.Decoder
24+ import kotlinx.serialization.encoding.Encoder
25+ import kotlinx.serialization.json.JsonArray
26+ import kotlinx.serialization.json.JsonDecoder
27+ import kotlinx.serialization.json.JsonElement
28+ import kotlinx.serialization.json.JsonEncoder
29+ import kotlinx.serialization.json.JsonNull
30+ import kotlinx.serialization.json.JsonObject
31+ import kotlinx.serialization.json.JsonPrimitive
32+ import kotlinx.serialization.json.boolean
33+ import kotlinx.serialization.json.booleanOrNull
34+ import kotlinx.serialization.json.contentOrNull
35+ import kotlinx.serialization.json.double
36+ import kotlinx.serialization.json.doubleOrNull
37+ import kotlinx.serialization.json.jsonArray
38+ import kotlinx.serialization.json.jsonObject
39+ import kotlinx.serialization.json.jsonPrimitive
1540
1641/* *
1742 * Created by Tarun on 03-08-17.
1843 */
1944@Parcelize
2045@Serializable
21- data class DataRow (var row : List <String ?> = listOf()) : Parcelable
46+ data class DataRow (
47+ @Serializable(with = RowDeserializer ::class )
48+ val row : List <String ?> = emptyList()
49+ ) : Parcelable
50+
51+ object RowDeserializer : KSerializer<List<String?>> {
52+
53+ @OptIn(ExperimentalSerializationApi ::class )
54+ override val descriptor: SerialDescriptor =
55+ ListSerializer (String .serializer().nullable).descriptor
56+
57+ override fun deserialize (decoder : Decoder ): List <String ?> {
58+ val jsonElement = (decoder as ? JsonDecoder )?.decodeJsonElement()
59+ ? : throw SerializationException (" Decoder is not a JsonDecoder" )
60+
61+ return read(jsonElement)
62+ }
63+
64+ private fun read (jsonElement : JsonElement ): List <String ?> {
65+ return when (jsonElement) {
66+ is JsonArray -> {
67+ jsonElement.map { element ->
68+ when (element) {
69+ is JsonPrimitive -> element.contentOrNull
70+ is JsonArray -> element.joinToString(" -" ) {
71+ it.jsonPrimitive.content
72+ }
73+ else -> element.toString()
74+ }
75+ }
76+ }
77+
78+ else -> throw SerializationException (" Expected JsonArray, got $jsonElement " )
79+ }
80+ }
81+
82+ override fun serialize (encoder : Encoder , value : List <String ?>) {
83+ if (encoder !is JsonEncoder ) {
84+ throw SerializationException (" This serializer can only be used with Json" )
85+ }
86+
87+ val jsonArray = JsonArray (value.map {
88+ when {
89+ it == null -> JsonNull
90+ else -> JsonPrimitive (it)
91+ }
92+ })
93+
94+ encoder.encodeJsonElement(jsonArray)
95+ }
96+ }
0 commit comments