|
4 | 4 | package com.agentclientprotocol.model |
5 | 5 |
|
6 | 6 | import com.agentclientprotocol.annotations.UnstableApi |
7 | | -import kotlinx.serialization.DeserializationStrategy |
8 | 7 | import kotlinx.serialization.ExperimentalSerializationApi |
| 8 | +import kotlinx.serialization.InternalSerializationApi |
| 9 | +import kotlinx.serialization.KSerializer |
| 10 | +import kotlinx.serialization.SerializationException |
9 | 11 | import kotlinx.serialization.SerialName |
10 | 12 | import kotlinx.serialization.Serializable |
| 13 | +import kotlinx.serialization.descriptors.SerialDescriptor |
| 14 | +import kotlinx.serialization.builtins.ListSerializer |
11 | 15 | import kotlinx.serialization.json.JsonClassDiscriminator |
12 | | -import kotlinx.serialization.json.JsonContentPolymorphicSerializer |
| 16 | +import kotlinx.serialization.json.JsonArray |
| 17 | +import kotlinx.serialization.json.JsonDecoder |
13 | 18 | import kotlinx.serialization.json.JsonElement |
| 19 | +import kotlinx.serialization.json.JsonEncoder |
14 | 20 | import kotlinx.serialization.json.jsonArray |
15 | 21 | import kotlinx.serialization.json.jsonObject |
16 | 22 |
|
@@ -41,7 +47,7 @@ public data class SessionConfigSelectOption( |
41 | 47 | @Serializable |
42 | 48 | public data class SessionConfigSelectGroup( |
43 | 49 | val group: SessionConfigGroupId, |
44 | | - val name: String, |
| 50 | + val name: String? = null, |
45 | 51 | val options: List<SessionConfigSelectOption>, |
46 | 52 | override val _meta: JsonElement? = null |
47 | 53 | ) : AcpWithMeta |
@@ -82,16 +88,43 @@ public sealed class SessionConfigSelectOptions { |
82 | 88 | */ |
83 | 89 | @OptIn(UnstableApi::class) |
84 | 90 | 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() |
87 | 117 | val array = element.jsonArray |
88 | | - if (array.isEmpty()) return SessionConfigSelectOptions.Flat.serializer() |
| 118 | + |
| 119 | + if (array.isEmpty()) return SessionConfigSelectOptions.Flat(emptyList()) |
89 | 120 |
|
90 | 121 | val firstElement = array[0].jsonObject |
91 | 122 | return if ("group" in firstElement) { |
92 | | - SessionConfigSelectOptions.Grouped.serializer() |
| 123 | + val groups = array.map { json.decodeFromJsonElement(SessionConfigSelectGroup.serializer(), it) } |
| 124 | + SessionConfigSelectOptions.Grouped(groups) |
93 | 125 | } else { |
94 | | - SessionConfigSelectOptions.Flat.serializer() |
| 126 | + val options = array.map { json.decodeFromJsonElement(SessionConfigSelectOption.serializer(), it) } |
| 127 | + SessionConfigSelectOptions.Flat(options) |
95 | 128 | } |
96 | 129 | } |
97 | 130 | } |
|
0 commit comments