diff --git a/build.gradle.kts b/build.gradle.kts index f23f144..bfae4e2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "dev.adamko.kafkatorio" -version = "0.2.6" +version = "0.2.7" val licenseFile: RegularFile by extra(layout.projectDirectory.file("LICENSE")) diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt index 63d0c43..d142fbb 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioLuaObjects.kt @@ -1,5 +1,6 @@ package dev.adamko.kafkatorio.events.schema +import kotlinx.serialization.Contextual import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.EncodeDefault import kotlinx.serialization.Serializable @@ -9,7 +10,7 @@ import kotlinx.serialization.json.contentOrNull import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -@Serializable(with = FactorioObjectDataSerializer::class) +@Serializable(with = FactorioObjectDataJsonSerializer::class) sealed class FactorioObjectData { @EncodeDefault @@ -43,7 +44,7 @@ sealed class FactorioObjectData { } } -object FactorioObjectDataSerializer : JsonContentPolymorphicSerializer( +object FactorioObjectDataJsonSerializer : JsonContentPolymorphicSerializer( FactorioObjectData::class ) { private val key = FactorioObjectData::objectName.name @@ -58,6 +59,8 @@ object FactorioObjectDataSerializer : JsonContentPolymorphicSerializer PlayerData.serializer() FactorioObjectData.ObjectName.LuaEntity -> EntityData.serializer() @@ -66,8 +69,6 @@ object FactorioObjectDataSerializer : JsonContentPolymorphicSerializer MapTile.serializer() FactorioObjectData.ObjectName.LuaTiles -> MapTiles.serializer() FactorioObjectData.ObjectName.ConsoleChatMessage -> ConsoleChatMessage.serializer() - null -> - throw Exception("Unknown FactorioObjectData $key: '$type' ") } } } @@ -75,7 +76,8 @@ object FactorioObjectDataSerializer : JsonContentPolymorphicSerializer, val characterUnitNumber: UInt?, val name: String, diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt index 31dfabd..8fc42ea 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/factorioPrototypes.kt @@ -1,5 +1,7 @@ package dev.adamko.kafkatorio.events.schema +import dev.adamko.kafkatorio.events.schema.FactorioPrototype.PrototypeObjectName +import kotlinx.serialization.Contextual import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.EncodeDefault import kotlinx.serialization.Serializable @@ -20,7 +22,7 @@ data class FactorioPrototypes( } -@Serializable(with = FactorioPrototypeSerializer::class) +@Serializable(with = FactorioPrototypeJsonSerializer::class) sealed class FactorioPrototype { @EncodeDefault abstract val prototypeObjectName: PrototypeObjectName @@ -30,7 +32,8 @@ sealed class FactorioPrototype { } } -object FactorioPrototypeSerializer : JsonContentPolymorphicSerializer( + +object FactorioPrototypeJsonSerializer : JsonContentPolymorphicSerializer( FactorioPrototype::class ) { private val key = FactorioPrototype::prototypeObjectName.name @@ -42,13 +45,13 @@ object FactorioPrototypeSerializer : JsonContentPolymorphicSerializer - FactorioPrototype.PrototypeObjectName.values().firstOrNull { it.name == json } + PrototypeObjectName.values().firstOrNull { it.name == json } } + requireNotNull(type) { "Unknown FactorioPrototype ${key}: $element" } + return when (type) { - FactorioPrototype.PrototypeObjectName.LuaTilePrototype -> MapTilePrototype.serializer() - null -> - throw Exception("Unknown FactorioPrototype $key: '$type' ") + PrototypeObjectName.LuaTilePrototype -> MapTilePrototype.serializer() } } } @@ -59,7 +62,8 @@ data class MapTilePrototype( val name: String, val layer: UInt, val mapColour: Colour, - @Serializable(with = FactorioJsonListSerializer::class) +// @Serializable(with = FactorioJsonListSerializer::class) + @Contextual val collisionMasks: List, val order: String, /** Can the tile be mined for resources? */ diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/json.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/json.kt index e477521..0c4642e 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/json.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/json.kt @@ -7,46 +7,62 @@ import kotlinx.serialization.json.JsonArray import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.JsonTransformingSerializer -import kotlinx.serialization.json.jsonArray -import kotlinx.serialization.json.jsonObject +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.modules.SerializersModule val jsonMapperKafkatorio = Json { prettyPrint = true prettyPrintIndent = " " -// serializersModule = FactorioEvent.kxsModule -// serializersModule = KafkatorioPacket.kxsModule + FactorioEvent.kxsModule -// serializersModule = SerializersModule { } + + serializersModule = SerializersModule { + contextual(List::class) { args -> FactorioJsonListSerializer(args[0]) } + } + } -/** Factorio outputs lists as Json objects - this serializer converts an object back to a list. */ -// actually I'm not sure that it does - I think *empty* lists get encoded as *empty* objects -internal class ListAsObjectSerializer(dataSerializer: KSerializer) : - JsonTransformingSerializer>(ListSerializer(dataSerializer)) { - - override fun transformDeserialize(element: JsonElement): JsonElement = - JsonArray( - element.jsonObject.values.toList() - ) - - override fun transformSerialize(element: JsonElement): JsonElement = - JsonObject( - element.jsonArray.mapIndexed { index, jsonElement -> "$index" to jsonElement }.toMap() - ) -} - - -/** Factorio outputs lists as Json objects - this serializer converts an object back to a list. */ -// actually I'm not sure that it does - I think *empty* lists get encoded as *empty* objects -internal class FactorioJsonListSerializer(dataSerializer: KSerializer) : +/** + * Factorio outputs an *empty* list as an *empty* Json object. This serde performs the same + * conversion + */ +class FactorioJsonListSerializer(dataSerializer: KSerializer) : JsonTransformingSerializer>(ListSerializer(dataSerializer)) { override fun transformDeserialize(element: JsonElement): JsonElement { - return if (element is JsonObject) { - JsonArray(emptyList()) - } else { - element + return when (element) { + is JsonObject -> JsonArray(emptyList()) + else -> element + } + } + + override fun transformSerialize(element: JsonElement): JsonElement { + return when { + element is JsonArray && element.isEmpty() -> buildJsonObject { } + else -> element } } } + +//internal class FactorioListSerializer( +// private val tSerializer: KSerializer +//) : KSerializer> { +// +// override val descriptor: SerialDescriptor get() = tSerializer.descriptor +// private val tListSerializer = ListSerializer(tSerializer) +// private val jsonTransformer = FactorioJsonListSerializer(tSerializer) +// +// override fun serialize(encoder: Encoder, value: List) { +// when (encoder) { +// is JsonEncoder -> jsonTransformer.serialize(encoder, value) +// else -> tListSerializer.serialize(encoder, value) +// } +// } +// +// override fun deserialize(decoder: Decoder): List { +// return when (decoder) { +// is JsonDecoder -> jsonTransformer.deserialize(decoder) +// else -> tListSerializer.deserialize(decoder) +// } +// } +//} diff --git a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt index 56e86cb..cb98d95 100644 --- a/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt +++ b/modules/events-schema/src/commonMain/kotlin/dev/adamko/kafkatorio/events/schema/kafkatorioPacket.kt @@ -10,7 +10,7 @@ import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive -@Serializable(with = KafkatorioPacketSerializer::class) +@Serializable(with = KafkatorioPacketJsonSerializer::class) sealed class KafkatorioPacket { /** Schema versioning */ abstract val modVersion: String @@ -24,7 +24,8 @@ sealed class KafkatorioPacket { } } -object KafkatorioPacketSerializer : JsonContentPolymorphicSerializer( + +object KafkatorioPacketJsonSerializer : JsonContentPolymorphicSerializer( KafkatorioPacket::class ) { private val key = KafkatorioPacket::packetType.name @@ -39,12 +40,12 @@ object KafkatorioPacketSerializer : JsonContentPolymorphicSerializer FactorioEvent.serializer() - KafkatorioPacket.PacketType.CONFIG -> FactorioConfigurationUpdate.serializer() + KafkatorioPacket.PacketType.EVENT -> FactorioEvent.serializer() + KafkatorioPacket.PacketType.CONFIG -> FactorioConfigurationUpdate.serializer() KafkatorioPacket.PacketType.PROTOTYPES -> FactorioPrototypes.serializer() - null -> - throw Exception("Unknown KafkatorioPacket ${key}: '$type' ") } } } diff --git a/modules/infra-factorio-server/src/.env b/modules/infra-factorio-server/src/.env index 129db2a..aecb9bc 100644 --- a/modules/infra-factorio-server/src/.env +++ b/modules/infra-factorio-server/src/.env @@ -1,4 +1,4 @@ # Do not edit manually. This file was created with task 'dockerEnv' COMPOSE_PROJECT_NAME=kafkatorio FACTORIO_VERSION=1.1.53 -KAFKATORIO_VERSION=0.2.6 +KAFKATORIO_VERSION=0.2.7 diff --git a/modules/infra-kafka-cluster/src/.env b/modules/infra-kafka-cluster/src/.env index afa5814..1ebae11 100644 --- a/modules/infra-kafka-cluster/src/.env +++ b/modules/infra-kafka-cluster/src/.env @@ -1,3 +1,3 @@ # Do not edit manually. This file was created with task 'dockerEnv' COMPOSE_PROJECT_NAME=kafkatorio -KAFKATORIO_VERSION=0.2.6 +KAFKATORIO_VERSION=0.2.7 diff --git a/modules/infra-kafka-pipe/src/.env b/modules/infra-kafka-pipe/src/.env index afa5814..1ebae11 100644 --- a/modules/infra-kafka-pipe/src/.env +++ b/modules/infra-kafka-pipe/src/.env @@ -1,3 +1,3 @@ # Do not edit manually. This file was created with task 'dockerEnv' COMPOSE_PROJECT_NAME=kafkatorio -KAFKATORIO_VERSION=0.2.6 +KAFKATORIO_VERSION=0.2.7