aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/json/CodecSerializer.kt
blob: 9ea08ad9cc6e8868f1da3236958b9c2a7d979dcc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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
	}
}