Skip to content

Commit 1b67765

Browse files
committed
feat: add ZonedDateTime codec and serializer; implement serialization logic and integrate into SurfCodecs
1 parent fc2f5ed commit 1b67765

File tree

4 files changed

+31
-32
lines changed

4 files changed

+31
-32
lines changed

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/SurfCodecs.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import dev.slne.surf.surfapi.core.api.serializer.java.datetime.date.local.LocalD
1616
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.instant.InstantCodec
1717
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.ldt.LocalDateTimeCodec
1818
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.offset.OffsetDateTimeCodec
19+
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.zdt.ZonedDateTimeCodec
1920
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URICodec
2021
import dev.slne.surf.surfapi.core.api.serializer.java.uuid.JavaUUIDCodec
2122
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2d.SpongeMatrix2dCodec
@@ -97,5 +98,6 @@ object SurfCodecs {
9798
val INSTANT = InstantCodec.CODEC
9899
val LOCAL_DATE_TIME = LocalDateTimeCodec.CODEC
99100
val OFFSET_DATE_TIME = OffsetDateTimeCodec.CODEC
101+
val ZONED_DATE_TIME = ZonedDateTimeCodec.CODEC
100102
// endregion
101103
}

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/SurfSerializerModule.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import dev.slne.surf.surfapi.core.api.serializer.java.datetime.date.local.LocalD
1717
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.instant.InstantSerializer
1818
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.ldt.LocalDateTimeSerializer
1919
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.offset.OffsetDateTimeSerializer
20+
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.zdt.ZonedDateTimeSerializer
2021
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URISerializer
2122
import dev.slne.surf.surfapi.core.api.serializer.java.uuid.JavaUUIDSerializer
2223
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2d.SpongeMatrix2dSerializer
@@ -102,6 +103,7 @@ object SurfSerializerModule {
102103
contextual(InstantSerializer)
103104
contextual(LocalDateTimeSerializer)
104105
contextual(OffsetDateTimeSerializer)
106+
contextual(ZonedDateTimeSerializer)
105107
}
106108

107109
val all = SerializersModule {

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/java/datetime/datetime/zdt/ZonedDateTimeCodec.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@ import java.time.ZonedDateTime
99
object ZonedDateTimeCodec {
1010
val CODEC: Codec<ZonedDateTime> = RecordCodecBuilder.create { instance ->
1111
instance.group(
12-
ZoneIdCodec.CODEC.fieldOf("zoneId").forGetter(ZonedDateTime::getZone),
13-
InstantCodec.CODEC.fieldOf("instant").forGetter(ZonedDateTime::toInstant)
14-
).apply(instance) { zoneId, instant ->
15-
ZonedDateTime.ofInstant(instant, zoneId)
16-
}
12+
InstantCodec.CODEC.fieldOf("instant").forGetter(ZonedDateTime::toInstant),
13+
ZoneIdCodec.CODEC.fieldOf("zoneId").forGetter(ZonedDateTime::getZone)
14+
).apply(instance, ZonedDateTime::ofInstant)
1715
}
1816
}

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/java/datetime/datetime/zdt/ZonedDateTimeSerializer.kt

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ import kotlinx.serialization.ExperimentalSerializationApi
88
import kotlinx.serialization.KSerializer
99
import kotlinx.serialization.Serializable
1010
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
11-
import kotlinx.serialization.encoding.Decoder
12-
import kotlinx.serialization.encoding.Encoder
13-
import kotlinx.serialization.encoding.decodeStructure
14-
import kotlinx.serialization.encoding.encodeStructure
11+
import kotlinx.serialization.encoding.*
1512
import java.time.Instant
1613
import java.time.ZoneId
1714
import java.time.ZonedDateTime
@@ -28,32 +25,32 @@ object ZonedDateTimeSerializer : KSerializer<ZonedDateTime> {
2825
override fun serialize(
2926
encoder: Encoder,
3027
value: ZonedDateTime,
31-
) {
32-
encoder.encodeStructure(descriptor) {
33-
encodeSerializableElement(descriptor, 0, ZonedIdSerializer, value.zone)
34-
encodeSerializableElement(descriptor, 1, InstantSerializer, value.toInstant())
35-
}
28+
) = encoder.encodeStructure(descriptor) {
29+
encodeSerializableElement(descriptor, 0, ZonedIdSerializer, value.zone)
30+
encodeSerializableElement(descriptor, 1, InstantSerializer, value.toInstant())
3631
}
3732

38-
override fun deserialize(decoder: Decoder): ZonedDateTime =
39-
decoder.decodeStructure(descriptor) {
40-
var zoneId: ZoneId? = null
41-
var instant: Instant? = null
42-
43-
if (decodeSequentially()) {
44-
zoneId = decodeSerializableElement(descriptor, 0, ZonedIdSerializer)
45-
instant = decodeSerializableElement(descriptor, 1, InstantSerializer)
46-
} else while (true) {
47-
when (decodeElementIndex(descriptor)) {
48-
0 -> zoneId = decodeSerializableElement(descriptor, 0, ZonedIdSerializer)
49-
1 -> instant = decodeSerializableElement(descriptor, 1, InstantSerializer)
50-
else -> break
51-
}
33+
override fun deserialize(
34+
decoder: Decoder,
35+
): ZonedDateTime = decoder.decodeStructure(descriptor) {
36+
var zoneId: ZoneId? = null
37+
var instant: Instant? = null
38+
39+
if (decodeSequentially()) {
40+
zoneId = decodeSerializableElement(descriptor, 0, ZonedIdSerializer)
41+
instant = decodeSerializableElement(descriptor, 1, InstantSerializer)
42+
} else while (true) {
43+
when (val index = decodeElementIndex(descriptor)) {
44+
0 -> zoneId = decodeSerializableElement(descriptor, 0, ZonedIdSerializer)
45+
1 -> instant = decodeSerializableElement(descriptor, 1, InstantSerializer)
46+
CompositeDecoder.DECODE_DONE -> break
47+
else -> error("Unexpected index: $index")
5248
}
49+
}
5350

54-
require(zoneId != null) { "Missing value for zoneId" }
55-
require(instant != null) { "Missing value for instant" }
51+
require(zoneId != null) { "Missing value for zoneId" }
52+
require(instant != null) { "Missing value for instant" }
5653

57-
ZonedDateTime.ofInstant(instant, zoneId)
58-
}
54+
ZonedDateTime.ofInstant(instant, zoneId)
55+
}
5956
}

0 commit comments

Comments
 (0)