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

commonMain.maryk.test.models.Measurement.kt Maven / Gradle / Ivy

package maryk.test.models

import maryk.core.models.DataModel
import maryk.core.models.RootDataModel
import maryk.core.properties.definitions.EmbeddedValuesDefinition
import maryk.core.properties.definitions.IsUsableInMultiType
import maryk.core.properties.definitions.NumberDefinition
import maryk.core.properties.definitions.dateTime
import maryk.core.properties.definitions.index.Multiple
import maryk.core.properties.definitions.index.Reversed
import maryk.core.properties.definitions.multiType
import maryk.core.properties.definitions.number
import maryk.core.properties.enum.IndexedEnumImpl
import maryk.core.properties.enum.MultiTypeEnum
import maryk.core.properties.enum.MultiTypeEnumDefinition
import maryk.core.properties.types.TimePrecision.MILLIS
import maryk.core.properties.types.numeric.UInt16
import maryk.core.values.Values
import maryk.test.models.Measurement.timestamp

object WeightMeasurement : DataModel() {
    val weightInKg by number(index = 1u, type = UInt16)
}
object LengthMeasurement : DataModel() {
    val lengthInCm by number(index = 1u, type = UInt16)
}

sealed class MeasurementType(index: UInt, override val definition: IsUsableInMultiType?, alternativeNames: Set? = null) : IndexedEnumImpl>(index, alternativeNames),
    MultiTypeEnum {
    object Weight : MeasurementType>(1u, EmbeddedValuesDefinition(dataModel = { WeightMeasurement }))
    object Length : MeasurementType>(2u, EmbeddedValuesDefinition(dataModel = { LengthMeasurement }))
    object Number : MeasurementType(3u, NumberDefinition(type = UInt16))

    companion object : MultiTypeEnumDefinition>(
        MeasurementType::class,
        values = { listOf(Weight, Length, Number) },
    )
}

object Measurement : RootDataModel(
    keyDefinition = {
        Multiple(
            Reversed(timestamp.ref()),
        )
    },
    indices = {
        listOf(
            Measurement { measurement.withType(MeasurementType.Length) { lengthInCm::ref } },
            Measurement { measurement simpleRefAtType MeasurementType.Number }
        )
    },
) {
    val timestamp by dateTime(index = 1u, final = true, precision = MILLIS,)
    val measurement by multiType(index = 2u, typeEnum = MeasurementType, final = true)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy