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

com.lightningkite.lightningdb.DataClassPath.kt Maven / Gradle / Ivy

@file:SharedCode
@file:OptIn(ExperimentalSerializationApi::class)

package com.lightningkite.lightningdb

import com.lightningkite.khrysalis.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.InternalSerializationApi
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.SerialKind
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.internal.GeneratedSerializer
import kotlin.reflect.KProperty1

@Serializable(DataClassPathSerializer::class)
abstract class DataClassPathPartial: Hashable {
    abstract fun getAny(key: K): Any?
    abstract fun setAny(key: K, any: Any?): K
    abstract val properties: List>
    abstract override fun hashCode(): Int
    abstract override fun toString(): String
    abstract override fun equals(other: Any?): Boolean
}

abstract class DataClassPath: DataClassPathPartial() {
    abstract fun get(key: K): V?
    abstract fun set(key: K, value: V): K
    @Suppress("UNCHECKED_CAST")
    override fun getAny(key: K):Any? = get(key)
    @Suppress("UNCHECKED_CAST")
    override fun setAny(key: K, any: Any?): K = set(key, any as V)
    abstract fun mapCondition(condition: Condition): Condition
    abstract fun mapModification(modification: Modification): Modification

    @JsName("prop")
    operator fun  get(prop: KProperty1) = DataClassPathAccess(this, prop)
}

class DataClassPathSelf(): DataClassPath() {
    override fun get(key: K): K? = key
    override fun set(key: K, value: K): K = value
    override fun toString(): String = "this"
    override fun hashCode(): Int = 0
    override fun equals(other: Any?): Boolean = other is DataClassPathSelf<*>
    override val properties: List> get() = listOf()
    override fun mapCondition(condition: Condition): Condition = condition
    override fun mapModification(modification: Modification): Modification = modification
}
data class DataClassPathAccess(val first: DataClassPath, val second: KProperty1): DataClassPath() {
    override fun get(key: K): V? = first.get(key)?.let { second.get(it) }
    override fun set(key: K, value: V): K = first.get(key)?.let { first.set(key, second.setCopy(it, value)) } ?: key
    override fun toString(): String = if(first is DataClassPathSelf<*>) second.name else "$first.${second.name}"
    override val properties: List> get() = first.properties + listOf(second)
    override fun mapCondition(condition: Condition): Condition = first.mapCondition(Condition.OnField(second, condition))
    override fun mapModification(modification: Modification): Modification = first.mapModification(Modification.OnField(second, modification))
}
data class DataClassPathNotNull(val wraps: DataClassPath): DataClassPath() {
    override val properties: List>
        get() = wraps.properties

    override fun get(key: K): V? = wraps.get(key)
    override fun set(key: K, value: V): K = wraps.set(key, value)
    override fun toString(): String = "$wraps?"
    override fun mapCondition(condition: Condition): Condition = wraps.mapCondition(Condition.IfNotNull(condition))
    override fun mapModification(modification: Modification): Modification = wraps.mapModification(Modification.IfNotNull(modification))
}
data class DataClassPathList(val wraps: DataClassPath>): DataClassPath() {
    override val properties: List>
        get() = wraps.properties

    override fun get(key: K): V? = wraps.get(key)?.firstOrNull()
    override fun set(key: K, value: V): K = wraps.set(key, listOf(value))
    override fun toString(): String = "$wraps.*"
    override fun mapCondition(condition: Condition): Condition = wraps.mapCondition(Condition.ListAllElements(condition))
    override fun mapModification(modification: Modification): Modification = wraps.mapModification(Modification.ListPerElement(Condition.Always(), modification))
}
data class DataClassPathSet(val wraps: DataClassPath>): DataClassPath() {
    override val properties: List>
        get() = wraps.properties

    override fun get(key: K): V? = wraps.get(key)?.firstOrNull()
    override fun set(key: K, value: V): K = wraps.set(key, setOf(value))
    override fun toString(): String = "$wraps.*"
    override fun mapCondition(condition: Condition): Condition = wraps.mapCondition(Condition.SetAllElements(condition))
    override fun mapModification(modification: Modification): Modification = wraps.mapModification(Modification.SetPerElement(Condition.Always(), modification))
}

@JsName("notNull")
val  DataClassPath.notNull: DataClassPathNotNull get() = DataClassPathNotNull(this)
@JsName("listElements")
@get:JvmName("getListElements")
val  DataClassPath>.elements: DataClassPathList get() = DataClassPathList(this)
@JsName("setElements")
@get:JvmName("getSetElements")
val  DataClassPath>.elements: DataClassPathSet get() = DataClassPathSet(this)




© 2015 - 2025 Weber Informatics LLC | Privacy Policy