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

eu.kevin.api.serializers.enums.EnumIgnoreUnknownSerializer.kt Maven / Gradle / Ivy

package eu.kevin.api.serializers.enums

import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

/**
 * The source code is taken from the https://gist.github.com/arberg/e20db05e018c61f37f1d274a254657c3
 */
abstract class EnumIgnoreUnknownSerializer>(
    values: Array,
    private val defaultValue: T
) : KSerializer {
    // Alternative to taking values in param, take clazz: Class
    // - private val values = clazz.enumConstants
    override val descriptor: SerialDescriptor =
        PrimitiveSerialDescriptor(values.first()::class.qualifiedName!!, PrimitiveKind.STRING)

    // Build maps for faster parsing, used @SerialName annotation if present, fall back to name
    private val lookup = values.associateBy({ it }, { it.serialName })
    private val revLookup = values.associateBy { it.serialName }

    private val Enum.serialName: String
        get() = this::class.java.getField(this.name).getAnnotation(SerialName::class.java)?.value ?: name

    override fun serialize(encoder: Encoder, value: T) {
        encoder.encodeString(lookup.getValue(value))
    }

    override fun deserialize(decoder: Decoder): T {
        // only run 'decoder.decodeString()' once
        return revLookup[decoder.decodeString()] ?: defaultValue // map.getOrDefault is not available < API-24
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy