All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.com.algolia.search.model.settings.SearchableAttribute.kt Maven / Gradle / Ivy

package com.algolia.search.model.settings

import com.algolia.search.helper.toAttribute
import com.algolia.search.model.Attribute
import com.algolia.search.serialize.internal.Key
import com.algolia.search.serialize.internal.regexUnordered
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.Serializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

@Serializable(SearchableAttribute.Companion::class)
public sealed class SearchableAttribute {

    /**
     * Putting several [attributes] in the same [Default] object will assign the same priority to each attribute.
     */
    public data class Default(val attributes: List) : SearchableAttribute() {

        public constructor(vararg attributes: Attribute) : this(attributes.toList())
    }

    /**
     * By default, searchable attributes are set as ordered: matches at the beginning of an attribute are more important
     * than in the middle, and matches in the middle are more important than towards the end.
     * Setting them as [Unordered] cancels out this behavior.
     */
    public data class Unordered(val attribute: Attribute) : SearchableAttribute()

    @OptIn(ExperimentalSerializationApi::class)
    @Serializer(SearchableAttribute::class)
    public companion object : KSerializer {

        override fun serialize(encoder: Encoder, value: SearchableAttribute) {
            val string = when (value) {
                is Default -> value.attributes.joinToString { it.raw }
                is Unordered -> "${Key.Unordered}(${value.attribute.raw})"
            }
            String.serializer().serialize(encoder, string)
        }

        override fun deserialize(decoder: Decoder): SearchableAttribute {
            val string = String.serializer().deserialize(decoder)
            val findUnordered = regexUnordered.find(string)

            return when {
                findUnordered != null -> Unordered(findUnordered.groupValues[1].toAttribute())
                else -> Default(string.split(", ").map { it.toAttribute() })
            }
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy