Skip to content

Commit 87d4ae2

Browse files
committed
Decode polymorphic using elementName rather than index
More in line with old code and probably more stable since we're dealing with maps
1 parent 1995071 commit 87d4ae2

File tree

4 files changed

+17
-17
lines changed

4 files changed

+17
-17
lines changed

firebase-common/src/androidMain/kotlin/dev/gitlive/firebase/_decoders.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ actual fun getPolymorphicType(value: Any?, discriminator: String): String =
3232
private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
3333
FirebaseClassDecoder(map.size, settings, { map.containsKey(it) }) { desc, index ->
3434
if (isNestedPolymorphic) {
35-
if (index == 0)
36-
map[desc.getElementName(index)]
37-
else {
35+
if (desc.getElementName(index) == "value")
3836
map
37+
else {
38+
map[desc.getElementName(index)]
3939
}
4040
} else {
4141
map[desc.getElementName(index)]

firebase-common/src/commonTest/kotlin/dev/gitlive/firebase/EncodersTest.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,12 @@ data class GenericClass<T>(
4949

5050
@Serializable
5151
abstract class AbstractClass {
52-
abstract val value: String
52+
abstract val abstractValue: String
5353
}
5454

5555
@Serializable
5656
@SerialName("implemented")
57-
data class ImplementedClass(override val value: String, val otherValue: Boolean) : AbstractClass()
57+
data class ImplementedClass(override val abstractValue: String, val otherValue: Boolean) : AbstractClass()
5858

5959
@Serializable
6060
data class NestedClass(
@@ -170,7 +170,7 @@ class EncodersTest {
170170
serializersModule = module
171171
}
172172

173-
nativeAssertEquals(nativeMapOf("type" to "implemented", "value" to "value", "otherValue" to true), encoded)
173+
nativeAssertEquals(nativeMapOf("type" to "implemented", "abstractValue" to "value", "otherValue" to true), encoded)
174174

175175
val decoded = decode(AbstractClass.serializer(), encoded) {
176176
serializersModule = module
@@ -197,7 +197,7 @@ class EncodersTest {
197197

198198
val testDataEncoded = nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to null, "valueClass" to 42)
199199
val sealedEncoded = nativeMapOf("type" to "test", "value" to "value")
200-
val abstractEncoded = nativeMapOf("type" to "implemented", "value" to "value", "otherValue" to true)
200+
val abstractEncoded = nativeMapOf("type" to "implemented", "abstractValue" to "value", "otherValue" to true)
201201
nativeAssertEquals(
202202
nativeMapOf(
203203
"testData" to testDataEncoded,
@@ -321,16 +321,16 @@ class EncodersTest {
321321

322322
val reencoded = reencodeTransformation(
323323
AbstractClass.serializer(),
324-
nativeMapOf("type" to "implemented", "value" to "value", "otherValue" to true),
324+
nativeMapOf("type" to "implemented", "abstractValue" to "value", "otherValue" to true),
325325
builder = {
326326
serializersModule = module
327327
}
328328
) {
329329
assertEquals(ImplementedClass("value", true), it)
330-
ImplementedClass("new-${it.value}", false)
330+
ImplementedClass("new-${it.abstractValue}", false)
331331
}
332332

333-
nativeAssertEquals(nativeMapOf("type" to "implemented", "value" to "new-value", "otherValue" to false), reencoded)
333+
nativeAssertEquals(nativeMapOf("type" to "implemented", "abstractValue" to "new-value", "otherValue" to false), reencoded)
334334
}
335335

336336
@Test
@@ -360,7 +360,7 @@ class EncodersTest {
360360

361361
val testDataEncoded = nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to null, "valueClass" to 42)
362362
val sealedEncoded = nativeMapOf("type" to "test", "value" to "value")
363-
val abstractEncoded = nativeMapOf("type" to "implemented", "value" to "value", "otherValue" to true)
363+
val abstractEncoded = nativeMapOf("type" to "implemented", "abstractValue" to "value", "otherValue" to true)
364364
nativeAssertEquals(
365365
nativeMapOf(
366366
"testData" to testDataEncoded,

firebase-common/src/iosMain/kotlin/dev/gitlive/firebase/_decoders.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ private fun FirebaseDecoder.decodeAsList(): CompositeDecoder = (value as? List<*
2828
private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
2929
FirebaseClassDecoder(map.size, settings, { map.containsKey(it) }) { desc, index ->
3030
if (isNestedPolymorphic) {
31-
if (index == 0)
32-
map[desc.getElementName(index)]
33-
else {
31+
if (desc.getElementName(index) == "value")
3432
map
33+
else {
34+
map[desc.getElementName(index)]
3535
}
3636
} else {
3737
map[desc.getElementName(index)]

firebase-common/src/jsMain/kotlin/dev/gitlive/firebase/_decoders.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,10 @@ private fun FirebaseDecoder.decodeAsList(): CompositeDecoder = (value as Array<*
4343
private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as Json).let { json ->
4444
FirebaseClassDecoder(js("Object").keys(value).length as Int, settings, { json[it] != undefined }) { desc, index ->
4545
if (isNestedPolymorphic) {
46-
if (index == 0) {
47-
json[desc.getElementName(index)]
48-
} else {
46+
if (desc.getElementName(index) == "value") {
4947
json
48+
} else {
49+
json[desc.getElementName(index)]
5050
}
5151
} else {
5252
json[desc.getElementName(index)]

0 commit comments

Comments
 (0)