Skip to content
This repository was archived by the owner on Nov 28, 2025. It is now read-only.

Commit 3e4957d

Browse files
committed
Fix RecursiveCodec not being able to be inlined
1 parent 20a9a8b commit 3e4957d

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
kotlin.code.style=official
2-
tide.version=3.3
2+
tide.version=3.4

src/main/kotlin/io/github/dockyardmc/tide/codec/RecursiveCodec.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package io.github.dockyardmc.tide.codec
22

33
import io.github.dockyardmc.tide.transcoder.Transcoder
44

5-
class RecursiveCodec<T>(self: (Codec<T>) -> Codec<T>) : Codec<T> {
5+
data class RecursiveCodec<T>(val self: (Codec<T>) -> Codec<T>) : Codec<T> {
66

77
val delegate = self.invoke(this)
88

src/main/kotlin/io/github/dockyardmc/tide/codec/StructCodec.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -951,9 +951,14 @@ interface StructCodec<R> : Codec<R> {
951951
private fun <D, T> put(transcoder: Transcoder<D>, codec: Codec<T>, map: Transcoder.VirtualMapBuilder<D>, key: String, value: T): D {
952952

953953
if (key == INLINE) {
954-
val encodeCodec: Codec<T> = if (codec is OptionalCodec<*>) codec.inner as Codec<T> else if (codec is DefaultCodec<T>) codec.inner else codec
954+
val encodeCodec: Codec<T> = when (codec) {
955+
is OptionalCodec<*> -> codec.inner as Codec<T>
956+
is DefaultCodec<*> -> codec.inner as Codec<T>
957+
is RecursiveCodec<*> -> codec.self as Codec<T>
958+
else -> codec
959+
}
955960
if (encodeCodec !is StructCodec<T>) {
956-
throw Codec.EncodingException("provided codec for $key is not StructCodec")
961+
throw Codec.EncodingException("Provided codec for inline $key is not StructCodec")
957962
}
958963

959964
return encodeCodec.encodeToMap(transcoder, value, map)
@@ -968,9 +973,14 @@ interface StructCodec<R> : Codec<R> {
968973
private fun <D, T> get(transcoder: Transcoder<D>, codec: Codec<T>, key: String, map: Transcoder.VirtualMap<D>): T {
969974

970975
if (key == INLINE) {
971-
val decodeCodec = if (codec is OptionalCodec<*>) codec.inner else if (codec is DefaultCodec<*>) codec.inner else codec
976+
val decodeCodec: Codec<T> = when (codec) {
977+
is OptionalCodec<*> -> codec.inner as Codec<T>
978+
is DefaultCodec<*> -> codec.inner as Codec<T>
979+
is RecursiveCodec<*> -> codec.self as Codec<T>
980+
else -> codec
981+
}
972982
if (decodeCodec !is StructCodec<*>) {
973-
throw Codec.DecodingException("provided codec for $key is not StructCodec")
983+
throw Codec.EncodingException("Provided codec for inline $key is not StructCodec")
974984
}
975985

976986
val result = runCatching {

0 commit comments

Comments
 (0)