Skip to content

Commit 2af1964

Browse files
committed
feat: add codecs and serializers for URL and Kotlin/Java Duration; enhance UUID codec with alternative formats
- Added `URL` codec and serializer using `URICodec` for conversion handling. - Enhanced `JavaUUIDCodec` with support for string and byte representations. - Introduced `KotlinDuration` and `JavaDuration` codecs and serializers. - Integrated new codecs and serializers into `SurfCodecs` and `SurfSerializerModule`.
1 parent 761757d commit 2af1964

File tree

6 files changed

+51
-18
lines changed

6 files changed

+51
-18
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import dev.slne.surf.surfapi.core.api.serializer.adventure.resourcepack.info.Adv
1111
import dev.slne.surf.surfapi.core.api.serializer.adventure.sound.AdventureSoundCodec
1212
import dev.slne.surf.surfapi.core.api.serializer.adventure.sound.stop.AdventureSoundStopCodec
1313
import dev.slne.surf.surfapi.core.api.serializer.adventure.title.AdventureTitleCodec
14+
import dev.slne.surf.surfapi.core.api.serializer.java.JavaDurationCodec
1415
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.date.date.DateCodec
1516
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.date.local.LocalDateCodec
1617
import dev.slne.surf.surfapi.core.api.serializer.java.datetime.datetime.instant.InstantCodec
@@ -25,7 +26,9 @@ import dev.slne.surf.surfapi.core.api.serializer.java.ip.inetsocket.InetSocketAd
2526
import dev.slne.surf.surfapi.core.api.serializer.java.ip.ipv4.Inet4AddressCodec
2627
import dev.slne.surf.surfapi.core.api.serializer.java.ip.ipv6.Inet6AddressCodec
2728
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URICodec
29+
import dev.slne.surf.surfapi.core.api.serializer.java.url.URLCodec
2830
import dev.slne.surf.surfapi.core.api.serializer.java.uuid.JavaUUIDCodec
31+
import dev.slne.surf.surfapi.core.api.serializer.kotlin.KotlinDurationCodec
2932
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2d.SpongeMatrix2dCodec
3033
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2f.SpongeMatrix2fCodec
3134
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m3d.SpongeMatrix3dCodec
@@ -99,6 +102,7 @@ object SurfCodecs {
99102

100103
// region Java
101104
val URI = URICodec.CODEC
105+
val URL = URLCodec.CODEC
102106
val UUID = JavaUUIDCodec.CODEC
103107
val DATE = DateCodec.CODEC
104108
val LOCAL_DATE = LocalDateCodec.CODEC
@@ -113,5 +117,10 @@ object SurfCodecs {
113117
val INET_SOCKET_ADDRESS = InetSocketAddressCodec.CODEC
114118
val INET4_ADDRESS = Inet4AddressCodec.CODEC
115119
val INET6_ADDRESS = Inet6AddressCodec.CODEC
120+
val JAVA_DURATION = JavaDurationCodec.CODEC
121+
// endregion
122+
123+
// region Kotlin
124+
val KOTLIN_DURATION = KotlinDurationCodec.CODEC
116125
// endregion
117126
}

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
@@ -26,6 +26,7 @@ import dev.slne.surf.surfapi.core.api.serializer.java.ip.inetsocket.InetSocketAd
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
2828
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URISerializer
29+
import dev.slne.surf.surfapi.core.api.serializer.java.url.URLSerializer
2930
import dev.slne.surf.surfapi.core.api.serializer.java.uuid.JavaUUIDSerializer
3031
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2d.SpongeMatrix2dSerializer
3132
import dev.slne.surf.surfapi.core.api.serializer.spongepowered.math.matrix.m2f.SpongeMatrix2fSerializer
@@ -118,6 +119,7 @@ object SurfSerializerModule {
118119
contextual(InetSocketAddressSerializer)
119120
contextual(Inet4AddressSerializer)
120121
contextual(Inet6AddressSerializer)
122+
contextual(URLSerializer)
121123
}
122124

123125
val all = SerializersModule {

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/java/uri/URICodec.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,5 @@ object URICodec {
1212
} catch (e: URISyntaxException) {
1313
DataResult.error { "Uri syntax error: ${e.message}" }
1414
}
15-
}, { uri ->
16-
uri.toString()
17-
}).stable()
15+
}, URI::toString).stable()
1816
}

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/java/url/URLCodec.kt

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,25 @@ package dev.slne.surf.surfapi.core.api.serializer.java.url
22

33
import com.mojang.serialization.Codec
44
import com.mojang.serialization.DataResult
5-
import java.net.URI
5+
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URICodec
6+
import java.net.MalformedURLException
67
import java.net.URISyntaxException
78
import java.net.URL
89

910
object URLCodec {
10-
val CODEC: Codec<URL> = Codec.STRING.comapFlatMap({ string ->
11+
val CODEC: Codec<URL> = URICodec.CODEC.flatXmap({ uri ->
1112
try {
12-
DataResult.success(URI(string).toURL())
13-
} catch (e: URISyntaxException) {
14-
DataResult.error { "Url syntax error: ${e.message}" }
13+
DataResult.success(uri.toURL())
14+
} catch (e: MalformedURLException) {
15+
DataResult.error { "Malformed URL: ${e.message}" }
16+
} catch (e: IllegalArgumentException) {
17+
DataResult.error { "URL is not absolute: ${e.message}" }
1518
}
1619
}, { url ->
17-
url.toURI().toString()
18-
}).stable()
20+
try {
21+
DataResult.success(url.toURI())
22+
} catch (e: URISyntaxException) {
23+
DataResult.error { "URI syntax error: ${e.message}" }
24+
}
25+
})
1926
}
Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
1-
@file:OptIn(ExperimentalSerializationApi::class)
2-
31
package dev.slne.surf.surfapi.core.api.serializer.java.url
42

5-
import kotlinx.serialization.ExperimentalSerializationApi
3+
import dev.slne.surf.surfapi.core.api.serializer.java.uri.URISerializer
4+
import kotlinx.serialization.KSerializer
5+
import kotlinx.serialization.Serializable
6+
import kotlinx.serialization.descriptors.SerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
import java.net.URL
10+
11+
typealias SerializableURL = @Serializable(with = URLSerializer::class) URL
12+
13+
object URLSerializer : KSerializer<URL> {
14+
override val descriptor = SerialDescriptor("surfapi.JavaURL", URISerializer.descriptor)
15+
16+
override fun serialize(encoder: Encoder, value: URL) {
17+
URISerializer.serialize(encoder, value.toURI())
18+
}
619

7-
//typealias SerializableURL = @Serializable(with = URLSerializer::class) URL
8-
//
9-
//@Serializer(forClass = URL::class)
10-
//object URLSerializer : KSerializer<URL>
20+
override fun deserialize(decoder: Decoder): URL {
21+
return URISerializer.deserialize(decoder).toURL()
22+
}
23+
}

surf-api-core/surf-api-core-api/src/main/kotlin/dev/slne/surf/surfapi/core/api/serializer/java/uuid/JavaUUIDCodec.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,15 @@ import dev.slne.surf.surfapi.core.api.serializer.fixedSize
55
import java.util.*
66

77
object JavaUUIDCodec {
8-
val CODEC: Codec<UUID> = Codec.LONG_STREAM
8+
val CODEC_BYTES: Codec<UUID> = Codec.LONG_STREAM
99
.fixedSize(2)
1010
.xmap({ bytes ->
1111
UUID(bytes[0], bytes[1])
1212
}, { uuid ->
1313
longArrayOf(uuid.mostSignificantBits, uuid.leastSignificantBits)
1414
})
15+
16+
val CODEC_STRING: Codec<UUID> = Codec.STRING.xmap(UUID::fromString, UUID::toString)
17+
18+
val CODEC: Codec<UUID> = Codec.withAlternative(CODEC_BYTES, CODEC_STRING)
1519
}

0 commit comments

Comments
 (0)