diff --git a/spine/src/commonMain/kotlin/Id.kt b/spine/src/commonMain/kotlin/Id.kt index 0a06eee..0c3dcc3 100644 --- a/spine/src/commonMain/kotlin/Id.kt +++ b/spine/src/commonMain/kotlin/Id.kt @@ -1,8 +1,13 @@ package opensavvy.spine +import kotlinx.serialization.KSerializer import kotlinx.serialization.Serializable +import kotlinx.serialization.descriptors.PrimitiveKind +import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder -@Serializable +@Serializable(with = Id.Serializer::class) data class Id( val service: Route.Segment, val resource: Route, @@ -11,6 +16,23 @@ data class Id( constructor(service: String, resource: Route) : this(Route.Segment(service), resource) override fun toString() = "$service/$resource" + + //region Serializer + internal object Serializer : KSerializer { + override val descriptor = PrimitiveSerialDescriptor("opensavvy.spine.Id", PrimitiveKind.STRING) + + override fun serialize(encoder: Encoder, value: Id) { + encoder.encodeString("${value.service}/${value.resource}") + } + + override fun deserialize(decoder: Decoder): Id { + val segments = decoder.decodeString().split('/') + .map { Route.Segment(it) } + + return Id(segments.first(), Route(segments.drop(1))) + } + } + //endregion } @Serializable diff --git a/spine/src/commonTest/kotlin/IdTest.kt b/spine/src/commonTest/kotlin/IdTest.kt index a5e4ac0..3617b21 100644 --- a/spine/src/commonTest/kotlin/IdTest.kt +++ b/spine/src/commonTest/kotlin/IdTest.kt @@ -1,5 +1,8 @@ package opensavvy.spine +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json import opensavvy.spine.Route.Companion.div import kotlin.test.Test import kotlin.test.assertEquals @@ -12,4 +15,15 @@ class IdTest { assertEquals("v2/int/35eb", id.toString()) } + + @Test + fun serialize() { + val id = Id(service = "v2", resource = Route / "int" / "35eb") + + val serialized = Json.encodeToString(id) + assertEquals("v2/int/35eb", id.toString()) + + val deserialized = Json.decodeFromString(serialized) + assertEquals(id, deserialized) + } }