Skip to content

Commit eb1db49

Browse files
authored
#63 Fix serializer of SessionConfigSelectOptions (#64)
1 parent 4a75f1d commit eb1db49

3 files changed

Lines changed: 418 additions & 9 deletions

File tree

acp-model/src/commonMain/kotlin/com/agentclientprotocol/model/SessionConfig.kt

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@
44
package com.agentclientprotocol.model
55

66
import com.agentclientprotocol.annotations.UnstableApi
7-
import kotlinx.serialization.DeserializationStrategy
87
import kotlinx.serialization.ExperimentalSerializationApi
8+
import kotlinx.serialization.InternalSerializationApi
9+
import kotlinx.serialization.KSerializer
10+
import kotlinx.serialization.SerializationException
911
import kotlinx.serialization.SerialName
1012
import kotlinx.serialization.Serializable
13+
import kotlinx.serialization.descriptors.SerialDescriptor
14+
import kotlinx.serialization.builtins.ListSerializer
1115
import kotlinx.serialization.json.JsonClassDiscriminator
12-
import kotlinx.serialization.json.JsonContentPolymorphicSerializer
16+
import kotlinx.serialization.json.JsonArray
17+
import kotlinx.serialization.json.JsonDecoder
1318
import kotlinx.serialization.json.JsonElement
19+
import kotlinx.serialization.json.JsonEncoder
1420
import kotlinx.serialization.json.jsonArray
1521
import kotlinx.serialization.json.jsonObject
1622

@@ -41,7 +47,7 @@ public data class SessionConfigSelectOption(
4147
@Serializable
4248
public data class SessionConfigSelectGroup(
4349
val group: SessionConfigGroupId,
44-
val name: String,
50+
val name: String? = null,
4551
val options: List<SessionConfigSelectOption>,
4652
override val _meta: JsonElement? = null
4753
) : AcpWithMeta
@@ -82,16 +88,43 @@ public sealed class SessionConfigSelectOptions {
8288
*/
8389
@OptIn(UnstableApi::class)
8490
internal object SessionConfigSelectOptionsSerializer :
85-
JsonContentPolymorphicSerializer<SessionConfigSelectOptions>(SessionConfigSelectOptions::class) {
86-
override fun selectDeserializer(element: JsonElement): DeserializationStrategy<SessionConfigSelectOptions> {
91+
KSerializer<SessionConfigSelectOptions> {
92+
93+
@OptIn(InternalSerializationApi::class)
94+
override val descriptor: SerialDescriptor =
95+
ListSerializer(JsonElement.serializer()).descriptor
96+
97+
override fun serialize(encoder: kotlinx.serialization.encoding.Encoder, value: SessionConfigSelectOptions) {
98+
val jsonEncoder = encoder as? JsonEncoder
99+
?: throw SerializationException("SessionConfigSelectOptionsSerializer supports only JSON")
100+
val json = jsonEncoder.json
101+
102+
val elements = when (value) {
103+
is SessionConfigSelectOptions.Flat ->
104+
value.options.map { json.encodeToJsonElement(SessionConfigSelectOption.serializer(), it) }
105+
is SessionConfigSelectOptions.Grouped ->
106+
value.groups.map { json.encodeToJsonElement(SessionConfigSelectGroup.serializer(), it) }
107+
}
108+
109+
jsonEncoder.encodeJsonElement(JsonArray(elements))
110+
}
111+
112+
override fun deserialize(decoder: kotlinx.serialization.encoding.Decoder): SessionConfigSelectOptions {
113+
val jsonDecoder = decoder as? JsonDecoder
114+
?: throw SerializationException("SessionConfigSelectOptionsSerializer supports only JSON")
115+
val json = jsonDecoder.json
116+
val element = jsonDecoder.decodeJsonElement()
87117
val array = element.jsonArray
88-
if (array.isEmpty()) return SessionConfigSelectOptions.Flat.serializer()
118+
119+
if (array.isEmpty()) return SessionConfigSelectOptions.Flat(emptyList())
89120

90121
val firstElement = array[0].jsonObject
91122
return if ("group" in firstElement) {
92-
SessionConfigSelectOptions.Grouped.serializer()
123+
val groups = array.map { json.decodeFromJsonElement(SessionConfigSelectGroup.serializer(), it) }
124+
SessionConfigSelectOptions.Grouped(groups)
93125
} else {
94-
SessionConfigSelectOptions.Flat.serializer()
126+
val options = array.map { json.decodeFromJsonElement(SessionConfigSelectOption.serializer(), it) }
127+
SessionConfigSelectOptions.Flat(options)
95128
}
96129
}
97130
}

0 commit comments

Comments
 (0)