Skip to content

Commit 29b89d2

Browse files
committed
feat: add BigDecimal and BigInteger serializers and codecs
- Introduced `BigDecimalSerializer` and `BigIntegerSerializer` for kotlinx.serialization. - Added `BigDecimalCodec` and `BigIntegerCodec` for Mojang serialization. - Registered serializers in `SurfSerializerModule`. - Updated version to 1.21.11-2.47.0.
1 parent ee21da2 commit 29b89d2

File tree

9 files changed

+209
-1
lines changed

9 files changed

+209
-1
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ org.jetbrains.dokka.experimental.gradle.pluginMode=V2Enabled
77
javaVersion=21
88
mcVersion=1.21.11
99
group=dev.slne.surf
10-
version=1.21.11-2.46.0
10+
version=1.21.11-2.47.0
1111
relocationPrefix=dev.slne.surf.surfapi.libs
1212
snapshot=false

surf-api-bukkit/surf-api-bukkit-api/api/surf-api-bukkit-api.api

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13840,6 +13840,34 @@ public final class dev/slne/surf/surfapi/core/api/serializer/java/ip/ipv6/Inet6A
1384013840
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/net/Inet6Address;)V
1384113841
}
1384213842

13843+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec {
13844+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec;
13845+
public final fun getCODEC ()Lcom/mojang/serialization/Codec;
13846+
}
13847+
13848+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer : kotlinx/serialization/KSerializer {
13849+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer;
13850+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
13851+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigDecimal;
13852+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
13853+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
13854+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigDecimal;)V
13855+
}
13856+
13857+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec {
13858+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec;
13859+
public final fun getCODEC ()Lcom/mojang/serialization/Codec;
13860+
}
13861+
13862+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer : kotlinx/serialization/KSerializer {
13863+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer;
13864+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
13865+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigInteger;
13866+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
13867+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
13868+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigInteger;)V
13869+
}
13870+
1384313871
public final class dev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec {
1384413872
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec;
1384513873
public final fun getCODEC ()Lcom/mojang/serialization/Codec;

surf-api-core/surf-api-core-api/api/surf-api-core-api.api

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8430,6 +8430,34 @@ public final class dev/slne/surf/surfapi/core/api/serializer/java/ip/ipv6/Inet6A
84308430
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/net/Inet6Address;)V
84318431
}
84328432

8433+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec {
8434+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec;
8435+
public final fun getCODEC ()Ldev/slne/surf/surfapi/libs/mojang/serialization/Codec;
8436+
}
8437+
8438+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer : kotlinx/serialization/KSerializer {
8439+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer;
8440+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
8441+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigDecimal;
8442+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
8443+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
8444+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigDecimal;)V
8445+
}
8446+
8447+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec {
8448+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec;
8449+
public final fun getCODEC ()Ldev/slne/surf/surfapi/libs/mojang/serialization/Codec;
8450+
}
8451+
8452+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer : kotlinx/serialization/KSerializer {
8453+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer;
8454+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
8455+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigInteger;
8456+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
8457+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
8458+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigInteger;)V
8459+
}
8460+
84338461
public final class dev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec {
84348462
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec;
84358463
public final fun getCODEC ()Ldev/slne/surf/surfapi/libs/mojang/serialization/Codec;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import dev.slne.surf.surfapi.core.api.serializer.java.ip.inet.InetAddressSeriali
2525
import dev.slne.surf.surfapi.core.api.serializer.java.ip.inetsocket.InetSocketAddressSerializer
2626
import dev.slne.surf.surfapi.core.api.serializer.java.ip.ipv4.Inet4AddressSerializer
2727
import dev.slne.surf.surfapi.core.api.serializer.java.ip.ipv6.Inet6AddressSerializer
28+
import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.BigDecimalSerializer
29+
import dev.slne.surf.surfapi.core.api.serializer.java.number.bigint.BigIntegerSerializer
2830
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URISerializer
2931
import dev.slne.surf.surfapi.core.api.serializer.java.url.URLSerializer
3032
import dev.slne.surf.surfapi.core.api.serializer.java.uuid.JavaUUIDSerializer
@@ -120,6 +122,8 @@ object SurfSerializerModule {
120122
contextual(Inet4AddressSerializer)
121123
contextual(Inet6AddressSerializer)
122124
contextual(URLSerializer)
125+
contextual(BigIntegerSerializer)
126+
contextual(BigDecimalSerializer)
123127
}
124128

125129
val all = SerializersModule {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal
2+
3+
import com.mojang.serialization.Codec
4+
import com.mojang.serialization.codecs.RecordCodecBuilder
5+
import dev.slne.surf.surfapi.core.api.serializer.java.number.bigint.BigIntegerCodec
6+
import java.math.BigDecimal
7+
8+
object BigDecimalCodec {
9+
val CODEC: Codec<BigDecimal> = RecordCodecBuilder.create { instance ->
10+
instance.group(
11+
BigIntegerCodec.CODEC.fieldOf("unscaledValue").forGetter(BigDecimal::unscaledValue),
12+
Codec.INT.optionalFieldOf("scale", 0).forGetter(BigDecimal::scale),
13+
Codec.INT.optionalFieldOf("precision", null).forGetter(BigDecimal::precision),
14+
).apply(instance) { unscaledValue, scale, precision ->
15+
if (precision == null) {
16+
BigDecimal(unscaledValue, scale)
17+
} else {
18+
BigDecimal(unscaledValue, scale, java.math.MathContext(precision))
19+
}
20+
}
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal
2+
3+
import dev.slne.surf.surfapi.core.api.serializer.java.number.bigint.BigIntegerSerializer
4+
import kotlinx.serialization.ExperimentalSerializationApi
5+
import kotlinx.serialization.KSerializer
6+
import kotlinx.serialization.Serializable
7+
import kotlinx.serialization.builtins.serializer
8+
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
9+
import kotlinx.serialization.descriptors.element
10+
import kotlinx.serialization.encoding.*
11+
import java.math.BigDecimal
12+
import java.math.BigInteger
13+
import java.math.MathContext
14+
15+
typealias SerializableBigDecimal = @Serializable(with = BigDecimalSerializer::class) BigDecimal
16+
17+
18+
object BigDecimalSerializer : KSerializer<BigDecimal> {
19+
override val descriptor =
20+
buildClassSerialDescriptor("surfapi.java.number.BigDecimal") {
21+
element("unscaledValue", BigIntegerSerializer.descriptor)
22+
element<Int>("scale", isOptional = true)
23+
element<Int>("precision", isOptional = true)
24+
}
25+
26+
override fun serialize(
27+
encoder: Encoder,
28+
value: BigDecimal
29+
) = encoder.encodeStructure(descriptor) {
30+
encodeSerializableElement(descriptor, 0, BigIntegerSerializer, value.unscaledValue())
31+
encodeIntElement(descriptor, 1, value.scale())
32+
encodeIntElement(descriptor, 2, value.precision())
33+
}
34+
35+
@OptIn(ExperimentalSerializationApi::class)
36+
override fun deserialize(decoder: Decoder): BigDecimal = decoder.decodeStructure(descriptor) {
37+
var unscaledValue: BigInteger? = null
38+
var scale: Int? = null
39+
var precision: Int? = null
40+
41+
if (decodeSequentially()) {
42+
unscaledValue = decodeSerializableElement(descriptor, 0, BigIntegerSerializer)
43+
scale = decodeNullableSerializableElement(descriptor, 1, Int.serializer())
44+
precision = decodeNullableSerializableElement(descriptor, 2, Int.serializer())
45+
} else while (true) {
46+
when (val index = decodeElementIndex(descriptor)) {
47+
0 -> unscaledValue = decodeSerializableElement(descriptor, 0, BigIntegerSerializer)
48+
1 -> scale = decodeIntElement(descriptor, 1)
49+
2 -> precision = decodeIntElement(descriptor, 2)
50+
CompositeDecoder.DECODE_DONE -> break
51+
else -> error("Unexpected index: $index")
52+
}
53+
}
54+
55+
requireNotNull(unscaledValue) { "Missing value for unscaledValue" }
56+
57+
if (precision == null) {
58+
BigDecimal(unscaledValue, scale ?: 0)
59+
} else {
60+
BigDecimal(unscaledValue, scale ?: 0, MathContext(precision))
61+
}
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package dev.slne.surf.surfapi.core.api.serializer.java.number.bigint
2+
3+
import com.mojang.serialization.Codec
4+
import java.math.BigInteger
5+
6+
object BigIntegerCodec {
7+
val CODEC: Codec<BigInteger> = Codec.STRING.xmap(::BigInteger, BigInteger::toString)
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package dev.slne.surf.surfapi.core.api.serializer.java.number.bigint
2+
3+
import kotlinx.serialization.KSerializer
4+
import kotlinx.serialization.Serializable
5+
import kotlinx.serialization.descriptors.PrimitiveKind
6+
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
import java.math.BigInteger
10+
11+
typealias SerializableBigInteger = @Serializable(with = BigIntegerSerializer::class) BigInteger
12+
13+
object BigIntegerSerializer : KSerializer<BigInteger> {
14+
override val descriptor =
15+
PrimitiveSerialDescriptor("surfapi.java.number.BigInteger", PrimitiveKind.STRING)
16+
17+
override fun serialize(
18+
encoder: Encoder,
19+
value: BigInteger
20+
) {
21+
encoder.encodeString(value.toString())
22+
}
23+
24+
override fun deserialize(decoder: Decoder): BigInteger {
25+
return BigInteger(decoder.decodeString())
26+
}
27+
}

surf-api-velocity/surf-api-velocity-api/api/surf-api-velocity-api.api

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11736,6 +11736,34 @@ public final class dev/slne/surf/surfapi/core/api/serializer/java/ip/ipv6/Inet6A
1173611736
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/net/Inet6Address;)V
1173711737
}
1173811738

11739+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec {
11740+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalCodec;
11741+
public final fun getCODEC ()Lcom/mojang/serialization/Codec;
11742+
}
11743+
11744+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer : kotlinx/serialization/KSerializer {
11745+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigdecimal/BigDecimalSerializer;
11746+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
11747+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigDecimal;
11748+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
11749+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
11750+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigDecimal;)V
11751+
}
11752+
11753+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec {
11754+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerCodec;
11755+
public final fun getCODEC ()Lcom/mojang/serialization/Codec;
11756+
}
11757+
11758+
public final class dev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer : kotlinx/serialization/KSerializer {
11759+
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/number/bigint/BigIntegerSerializer;
11760+
public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object;
11761+
public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/math/BigInteger;
11762+
public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor;
11763+
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
11764+
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/math/BigInteger;)V
11765+
}
11766+
1173911767
public final class dev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec {
1174011768
public static final field INSTANCE Ldev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec;
1174111769
public final fun getCODEC ()Lcom/mojang/serialization/Codec;

0 commit comments

Comments
 (0)