Skip to content

Commit 842c839

Browse files
authored
fix(rules): Promotion deserialization (#317)
1 parent c41228f commit 842c839

File tree

2 files changed

+64
-13
lines changed

2 files changed

+64
-13
lines changed

client/src/commonMain/kotlin/com/algolia/search/model/response/ResponseSearchRules.kt

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,34 +10,53 @@ import com.algolia.search.serialize.Key_HighlightResult
1010
import com.algolia.search.serialize.internal.JsonNonStrict
1111
import com.algolia.search.serialize.internal.asJsonInput
1212
import com.algolia.search.serialize.internal.jsonObjectOrNull
13-
import kotlinx.serialization.DeserializationStrategy
14-
import kotlinx.serialization.ExperimentalSerializationApi
13+
import kotlinx.serialization.KSerializer
1514
import kotlinx.serialization.SerialName
1615
import kotlinx.serialization.Serializable
17-
import kotlinx.serialization.Serializer
16+
import kotlinx.serialization.descriptors.SerialDescriptor
1817
import kotlinx.serialization.encoding.Decoder
18+
import kotlinx.serialization.encoding.Encoder
1919
import kotlinx.serialization.json.JsonObject
2020
import kotlinx.serialization.json.jsonObject
2121

2222
@Serializable
2323
public data class ResponseSearchRules(
24+
2425
/**
2526
* A list of [Hit].
2627
*/
2728
@SerialName(KeyHits) val hits: List<Hit>,
29+
30+
/**
31+
* Number of hits or null.
32+
*/
33+
@SerialName(KeyNbHits) val nbHitsOrNull: Int? = null,
34+
35+
/**
36+
* Returned page number or null.
37+
*/
38+
@SerialName(KeyPage) val pageOrNull: Int? = null,
39+
40+
/**
41+
* Total number of pages or null.
42+
*/
43+
@SerialName(KeyNbPages) val nbPagesOrNull: Int? = null
44+
) {
45+
2846
/**
2947
* Number of hits.
3048
*/
31-
@SerialName(KeyNbHits) val nbHits: Int,
49+
val nbHits: Int get() = requireNotNull(nbHitsOrNull)
50+
3251
/**
3352
* Returned page number.
3453
*/
35-
@SerialName(KeyPage) val page: Int,
54+
val page: Int get() = requireNotNull(pageOrNull)
55+
3656
/**
3757
* Total number of pages.
3858
*/
39-
@SerialName(KeyNbPages) val nbPages: Int
40-
) {
59+
val nbPages: Int get() = requireNotNull(nbPagesOrNull)
4160

4261
@Serializable(Hit.Companion::class)
4362
public data class Hit(
@@ -48,17 +67,20 @@ public data class ResponseSearchRules(
4867
public val highlightResult: JsonObject
4968
get() = highlightResultOrNull!!
5069

51-
@OptIn(ExperimentalSerializationApi::class)
52-
@Serializer(Hit::class)
53-
public companion object : DeserializationStrategy<Hit> {
70+
public companion object : KSerializer<Hit> {
71+
72+
override val descriptor: SerialDescriptor = Rule.serializer().descriptor
5473

5574
override fun deserialize(decoder: Decoder): Hit {
5675
val json = decoder.asJsonInput().jsonObject
5776
val rule = JsonNonStrict.decodeFromJsonElement(Rule.serializer(), json)
5877
val highlightResult = json[Key_HighlightResult]?.jsonObjectOrNull
59-
6078
return Hit(rule, highlightResult)
6179
}
80+
81+
override fun serialize(encoder: Encoder, value: Hit) {
82+
throw UnsupportedOperationException("ResponseSearchRules.Hit serialization is not an expected operation")
83+
}
6284
}
6385
}
6486
}

client/src/commonMain/kotlin/com/algolia/search/model/rule/Promotion.kt

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,17 @@ import com.algolia.search.model.ObjectID
66
import com.algolia.search.serialize.KeyObjectID
77
import com.algolia.search.serialize.KeyObjectIDs
88
import com.algolia.search.serialize.KeyPosition
9+
import com.algolia.search.serialize.internal.asJsonInput
10+
import kotlinx.serialization.KSerializer
911
import kotlinx.serialization.SerialName
1012
import kotlinx.serialization.Serializable
13+
import kotlinx.serialization.descriptors.SerialDescriptor
14+
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
15+
import kotlinx.serialization.encoding.Decoder
16+
import kotlinx.serialization.encoding.Encoder
17+
import kotlinx.serialization.json.jsonObject
1118

12-
@Serializable
19+
@Serializable(Promotion.Companion::class)
1320
public sealed class Promotion {
1421

1522
/**
@@ -34,6 +41,27 @@ public sealed class Promotion {
3441
@SerialName(KeyObjectIDs) val objectIDs: List<ObjectID>,
3542
@SerialName(KeyPosition) override val position: Int
3643
) : Promotion()
44+
45+
public companion object : KSerializer<Promotion> {
46+
47+
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("promotion")
48+
49+
override fun deserialize(decoder: Decoder): Promotion {
50+
val json = decoder.asJsonInput().jsonObject
51+
return when {
52+
json.containsKey(KeyObjectID) -> Single.serializer().deserialize(decoder)
53+
json.containsKey(KeyObjectIDs) -> Multiple.serializer().deserialize(decoder)
54+
else -> throw IllegalStateException("Unable to deserialize 'Promotion' object")
55+
}
56+
}
57+
58+
override fun serialize(encoder: Encoder, value: Promotion) {
59+
when (value) {
60+
is Single -> Single.serializer().serialize(encoder, value)
61+
is Multiple -> Multiple.serializer().serialize(encoder, value)
62+
}
63+
}
64+
}
3765
}
3866

3967
/**
@@ -50,4 +78,5 @@ public fun Promotion(objectID: ObjectID, position: Int): Promotion.Single = Prom
5078
* @param objectIDs list of unique identifiers of the objects to promote.
5179
* @param position promoted rank for the objects.
5280
*/
53-
public fun Promotion(objectIDs: List<ObjectID>, position: Int): Promotion.Multiple = Promotion.Multiple(objectIDs, position)
81+
public fun Promotion(objectIDs: List<ObjectID>, position: Int): Promotion.Multiple =
82+
Promotion.Multiple(objectIDs, position)

0 commit comments

Comments
 (0)