
commonMain.com.algolia.search.model.response.ResponseMultiSearch.kt Maven / Gradle / Ivy
package com.algolia.search.model.response
import com.algolia.search.model.multipleindex.IndexedQuery
import com.algolia.search.serialize.internal.Key
import com.algolia.search.serialize.internal.asJsonDecoder
import com.algolia.search.serialize.internal.asJsonInput
import com.algolia.search.serialize.internal.asJsonOutput
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
/**
* Response for multi search operation.
*/
@Serializable
public data class ResponseMultiSearch(
/**
* List of result in the order they were submitted, one element for each [IndexedQuery].
*/
@SerialName(Key.Results) public val results: List>
)
/**
* Multi search query response.
*/
@Serializable(ResultMultiSearchDeserializer::class)
public sealed interface ResultMultiSearch {
/** Actual search response */
public val response: T
/** Response for hits search */
public data class Hits(override val response: ResponseSearch) : ResultMultiSearch
/** Response for facets search */
public data class Facets(override val response: ResponseSearchForFacets) :
ResultMultiSearch
}
/**
* [ResultMultiSearch] serializer.
*/
internal class ResultMultiSearchDeserializer(dataSerializer: KSerializer) :
KSerializer> {
override val descriptor = dataSerializer.descriptor
override fun deserialize(decoder: Decoder): ResultMultiSearch {
val json = decoder.asJsonDecoder().json
val jsonObject = decoder.asJsonInput().jsonObject
return multiSearchResult(json, jsonObject)
}
@Suppress("UNCHECKED_CAST")
private fun multiSearchResult(json: Json, jsonObject: JsonObject): ResultMultiSearch {
return if (jsonObject.keys.contains(Key.FacetHits)) {
ResultMultiSearch.Facets(json.decodeFromJsonElement(ResponseSearchForFacets.serializer(), jsonObject))
} else {
ResultMultiSearch.Hits(json.decodeFromJsonElement(ResponseSearch.serializer(), jsonObject))
} as ResultMultiSearch
}
override fun serialize(encoder: Encoder, value: ResultMultiSearch) {
val json = encoder.asJsonOutput().json
when (value) {
is ResultMultiSearch.Hits -> json.encodeToString(ResponseSearch.serializer(), value.response)
is ResultMultiSearch.Facets -> json.encodeToString(ResponseSearchForFacets.serializer(), value.response)
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy