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

commonMain.dk.cachet.carp.common.infrastructure.serialization.CarpPrimitiveSerializer.kt Maven / Gradle / Ivy

package dk.cachet.carp.common.infrastructure.serialization

import kotlinx.serialization.KSerializer
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


const val NAMESPACE = "dk.cachet.carp.common"


/**
 * Creates a primitive serializer for CARP types in the [dk.cachet.carp.common] namespace
 * which are serialized using `toString` and deserialized using [fromString].
 */
internal inline fun  createCarpStringPrimitiveSerializer( noinline fromString: (String) -> T ) =
    object : StringConversionSerializer( "$NAMESPACE.${T::class.simpleName!!}", fromString ) { }

internal open class StringConversionSerializer(
    serialName: String,
    val fromString: (String) -> T
) : KSerializer
{
    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName, PrimitiveKind.STRING )

    override fun serialize( encoder: Encoder, value: T ) = encoder.encodeString( value.toString() )
    override fun deserialize( decoder: Decoder ): T = fromString( decoder.decodeString() )
}


/**
 * Creates a primitive serializer for CARP types in the [dk.cachet.carp.common] namespace
 * which are serialized using [toLong] and deserialized using [fromLong].
 */
internal inline fun  createCarpLongPrimitiveSerializer(
    noinline fromLong: (Long) -> T,
    noinline toLong: (T) -> Long
) =
    object : LongConversionSerializer( "$NAMESPACE.${T::class.simpleName!!}", fromLong, toLong ) { }

internal open class LongConversionSerializer(
    serialName: String,
    val fromLong: (Long) -> T,
    val toLong: (T) -> Long
) : KSerializer
{
    override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor( serialName, PrimitiveKind.LONG )

    override fun serialize( encoder: Encoder, value: T ) = encoder.encodeLong( toLong( value ) )
    override fun deserialize( decoder: Decoder ): T = fromLong( decoder.decodeLong() )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy