aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/json
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/util/json')
-rw-r--r--src/main/kotlin/util/json/BlockPosSerializer.kt2
-rw-r--r--src/main/kotlin/util/json/CodecSerializer.kt26
-rw-r--r--src/main/kotlin/util/json/DashlessUUIDSerializer.kt7
-rw-r--r--src/main/kotlin/util/json/FirmCodecs.kt4
-rw-r--r--src/main/kotlin/util/json/InstantAsLongSerializer.kt6
-rw-r--r--src/main/kotlin/util/json/KJsonUtils.kt11
-rw-r--r--src/main/kotlin/util/json/jsonConversion.kt65
7 files changed, 110 insertions, 11 deletions
diff --git a/src/main/kotlin/util/json/BlockPosSerializer.kt b/src/main/kotlin/util/json/BlockPosSerializer.kt
index 144b0a0..5906544 100644
--- a/src/main/kotlin/util/json/BlockPosSerializer.kt
+++ b/src/main/kotlin/util/json/BlockPosSerializer.kt
@@ -5,7 +5,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.serializer
-import net.minecraft.util.math.BlockPos
+import net.minecraft.core.BlockPos
object BlockPosSerializer : KSerializer<BlockPos> {
val delegate = serializer<List<Int>>()
diff --git a/src/main/kotlin/util/json/CodecSerializer.kt b/src/main/kotlin/util/json/CodecSerializer.kt
new file mode 100644
index 0000000..9ea08ad
--- /dev/null
+++ b/src/main/kotlin/util/json/CodecSerializer.kt
@@ -0,0 +1,26 @@
+package util.json
+
+import com.mojang.serialization.Codec
+import kotlinx.serialization.KSerializer
+import kotlinx.serialization.descriptors.SerialDescriptor
+import kotlinx.serialization.encoding.Decoder
+import kotlinx.serialization.encoding.Encoder
+import kotlinx.serialization.json.JsonElement
+import moe.nea.firmament.util.json.KJsonOps
+
+abstract class CodecSerializer<T>(val codec: Codec<T>) : KSerializer<T> {
+ override val descriptor: SerialDescriptor
+ get() = JsonElement.serializer().descriptor
+
+ override fun serialize(encoder: Encoder, value: T) {
+ encoder.encodeSerializableValue(
+ JsonElement.serializer(),
+ codec.encodeStart(KJsonOps.INSTANCE, value).orThrow
+ )
+ }
+
+ override fun deserialize(decoder: Decoder): T {
+ return codec.decode(KJsonOps.INSTANCE, decoder.decodeSerializableValue(JsonElement.serializer()))
+ .orThrow.first
+ }
+}
diff --git a/src/main/kotlin/util/json/DashlessUUIDSerializer.kt b/src/main/kotlin/util/json/DashlessUUIDSerializer.kt
index acb1dc8..f4b073a 100644
--- a/src/main/kotlin/util/json/DashlessUUIDSerializer.kt
+++ b/src/main/kotlin/util/json/DashlessUUIDSerializer.kt
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
-import moe.nea.firmament.util.parseDashlessUUID
+import moe.nea.firmament.util.parsePotentiallyDashlessUUID
object DashlessUUIDSerializer : KSerializer<UUID> {
override val descriptor: SerialDescriptor =
@@ -17,10 +17,7 @@ object DashlessUUIDSerializer : KSerializer<UUID> {
override fun deserialize(decoder: Decoder): UUID {
val str = decoder.decodeString()
- if ("-" in str) {
- return UUID.fromString(str)
- }
- return parseDashlessUUID(str)
+ return parsePotentiallyDashlessUUID(str)
}
override fun serialize(encoder: Encoder, value: UUID) {
diff --git a/src/main/kotlin/util/json/FirmCodecs.kt b/src/main/kotlin/util/json/FirmCodecs.kt
index c0863bc..d7b8f57 100644
--- a/src/main/kotlin/util/json/FirmCodecs.kt
+++ b/src/main/kotlin/util/json/FirmCodecs.kt
@@ -4,11 +4,11 @@ import com.mojang.serialization.Codec
import com.mojang.serialization.DataResult
import com.mojang.serialization.Lifecycle
import com.mojang.util.UndashedUuid
-import net.minecraft.util.Uuids
+import net.minecraft.core.UUIDUtil
object FirmCodecs {
@JvmField
- val UUID_LENIENT_PREFER_INT_STREAM = Codec.withAlternative(Uuids.INT_STREAM_CODEC, Codec.STRING.comapFlatMap(
+ val UUID_LENIENT_PREFER_INT_STREAM = Codec.withAlternative(UUIDUtil.CODEC, Codec.STRING.comapFlatMap(
{
try {
DataResult.success(UndashedUuid.fromStringLenient(it), Lifecycle.stable())
diff --git a/src/main/kotlin/util/json/InstantAsLongSerializer.kt b/src/main/kotlin/util/json/InstantAsLongSerializer.kt
index ad738dc..51b5f0a 100644
--- a/src/main/kotlin/util/json/InstantAsLongSerializer.kt
+++ b/src/main/kotlin/util/json/InstantAsLongSerializer.kt
@@ -2,7 +2,7 @@
package moe.nea.firmament.util.json
-import kotlinx.datetime.Instant
+import java.time.Instant
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
@@ -13,10 +13,10 @@ import kotlinx.serialization.encoding.Encoder
object InstantAsLongSerializer : KSerializer<Instant> {
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor("InstantAsLongSerializer", PrimitiveKind.LONG)
override fun deserialize(decoder: Decoder): Instant {
- return Instant.fromEpochMilliseconds(decoder.decodeLong())
+ return Instant.ofEpochMilli(decoder.decodeLong())
}
override fun serialize(encoder: Encoder, value: Instant) {
- encoder.encodeLong(value.toEpochMilliseconds())
+ encoder.encodeLong(value.toEpochMilli())
}
}
diff --git a/src/main/kotlin/util/json/KJsonUtils.kt b/src/main/kotlin/util/json/KJsonUtils.kt
new file mode 100644
index 0000000..b15119b
--- /dev/null
+++ b/src/main/kotlin/util/json/KJsonUtils.kt
@@ -0,0 +1,11 @@
+package moe.nea.firmament.util.json
+
+import kotlinx.serialization.json.JsonArray
+import kotlinx.serialization.json.JsonElement
+import kotlinx.serialization.json.JsonPrimitive
+
+fun <T : JsonElement> List<T>.asJsonArray(): JsonArray {
+ return JsonArray(this)
+}
+
+fun Iterable<String>.toJsonArray(): JsonArray = map { JsonPrimitive(it) }.asJsonArray()
diff --git a/src/main/kotlin/util/json/jsonConversion.kt b/src/main/kotlin/util/json/jsonConversion.kt
new file mode 100644
index 0000000..f921f7b
--- /dev/null
+++ b/src/main/kotlin/util/json/jsonConversion.kt
@@ -0,0 +1,65 @@
+package moe.nea.firmament.util.json
+
+import com.google.gson.JsonArray
+import com.google.gson.JsonElement
+import com.google.gson.JsonNull
+import com.google.gson.JsonObject
+import com.google.gson.JsonPrimitive
+import com.google.gson.internal.LazilyParsedNumber
+
+
+fun JsonElement.intoKotlinJson(): kotlinx.serialization.json.JsonElement {
+ when (this) {
+ is JsonNull -> return kotlinx.serialization.json.JsonNull
+ is JsonObject -> {
+ return kotlinx.serialization.json.JsonObject(
+ this.entrySet()
+ .associate { it.key to it.value.intoKotlinJson() })
+ }
+
+ is JsonArray -> {
+ return kotlinx.serialization.json.JsonArray(this.map { it.intoKotlinJson() })
+ }
+
+ is JsonPrimitive -> {
+ if (this.isString)
+ return kotlinx.serialization.json.JsonPrimitive(this.asString)
+ if (this.isBoolean)
+ return kotlinx.serialization.json.JsonPrimitive(this.asBoolean)
+ return kotlinx.serialization.json.JsonPrimitive(this.asNumber)
+ }
+
+ else -> error("Unknown json variant $this")
+ }
+}
+
+fun kotlinx.serialization.json.JsonElement.intoGson(): JsonElement {
+ when (this) {
+ is kotlinx.serialization.json.JsonNull -> return JsonNull.INSTANCE
+ is kotlinx.serialization.json.JsonPrimitive -> {
+ if (this.isString)
+ return JsonPrimitive(this.content)
+ if (this.content == "true")
+ return JsonPrimitive(true)
+ if (this.content == "false")
+ return JsonPrimitive(false)
+ return JsonPrimitive(LazilyParsedNumber(this.content))
+ }
+
+ is kotlinx.serialization.json.JsonObject -> {
+ val obj = JsonObject()
+ for ((k, v) in this) {
+ obj.add(k, v.intoGson())
+ }
+ return obj
+ }
+
+ is kotlinx.serialization.json.JsonArray -> {
+ val arr = JsonArray()
+ for (v in this) {
+ arr.add(v.intoGson())
+ }
+ return arr
+ }
+ }
+}