
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