diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/codec/KOptionalCodec.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/codec/KOptionalCodec.kt new file mode 100644 index 000000000..d83207062 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/codec/KOptionalCodec.kt @@ -0,0 +1,21 @@ +package ru.dbotthepony.mc.otm.data.codec + +import com.mojang.datafixers.util.Pair +import com.mojang.serialization.Codec +import com.mojang.serialization.DataResult +import com.mojang.serialization.DynamicOps +import ru.dbotthepony.kommons.util.KOptional + +class KOptionalCodec(val parent: Codec) : Codec> { + override fun encode(input: KOptional, ops: DynamicOps, prefix: T): DataResult { + return input.map { parent.encode(it, ops, prefix) }.orElse { DataResult.success(ops.empty()) } + } + + override fun decode(ops: DynamicOps, input: T): DataResult, T>> { + if (input == ops.empty()) { + return DataResult.success(Pair(KOptional(), ops.empty())) + } else { + return parent.decode(ops, input).map { Pair(KOptional(it.first), it.second) } + } + } +}