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

org.jetbrains.kotlinx.jupyter.api.libraries.Variables.kt Maven / Gradle / Ivy

package org.jetbrains.kotlinx.jupyter.api.libraries

import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.SerializationException
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonArray
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.serializer
import org.jetbrains.kotlinx.jupyter.util.ListToMapSerializer

@Serializable
data class Variable(val name: String, val value: String, val ignored: Boolean = false)

object VariablesMapSerializer : ListToMapSerializer(
    serializer(),
    ::Variable,
    { it.name to it.value },
)

data class DescriptorVariables(
    val properties: List = listOf(),
    val hasOrder: Boolean = false,
)

fun DescriptorVariables.filter(predicate: (Variable) -> Boolean): DescriptorVariables {
    return DescriptorVariables(properties.filter(predicate), hasOrder)
}

object DescriptorVariablesSerializer : KSerializer {
    override val descriptor: SerialDescriptor
        get() = serializer().descriptor

    override fun deserialize(decoder: Decoder): DescriptorVariables {
        val hasOrder: Boolean
        val properties: List =
            when (val obj = decoder.decodeSerializableValue(serializer())) {
                is JsonArray -> {
                    hasOrder = true
                    Json.decodeFromJsonElement(obj)
                }
                is JsonObject -> {
                    hasOrder = false
                    Json.decodeFromJsonElement(VariablesMapSerializer, obj)
                }
                else -> throw SerializationException("Library descriptor should be either object or array")
            }.filter { !it.ignored }

        return DescriptorVariables(properties, hasOrder)
    }

    override fun serialize(
        encoder: Encoder,
        value: DescriptorVariables,
    ) {
        if (value.hasOrder) {
            encoder.encodeSerializableValue(serializer(), value.properties)
        } else {
            encoder.encodeSerializableValue(serializer(), value.properties.associate { it.name to it.value })
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy