git.iko.soy/opencode-android
on fb38d12 help sign in
36 lines 1.5 kB history raw
1package soy.iko.opencode.data.network
3import soy.iko.opencode.data.model.BusEvent
4import soy.iko.opencode.data.model.MessageInfo
5import soy.iko.opencode.data.model.Part
6import soy.iko.opencode.data.model.ToolState
7import soy.iko.opencode.data.model.UnknownEvent
8import soy.iko.opencode.data.model.UnknownMessage
9import soy.iko.opencode.data.model.UnknownPart
10import soy.iko.opencode.data.model.ToolUnknown
11import kotlinx.serialization.ExperimentalSerializationApi
12import kotlinx.serialization.json.Json
13import kotlinx.serialization.modules.SerializersModule
15/**
16 * Single shared Json for the whole app.
17 *
18 * The polymorphic default deserializers are the resilience layer: when the server
19 * sends a `type` / `role` / `status` we don't model, decoding falls back to the
20 * Unknown variant instead of throwing — so a new opencode release can't break the
21 * event stream or message decoding.
22 */
23@OptIn(ExperimentalSerializationApi::class)
24val OpencodeJson: Json = Json {
25 ignoreUnknownKeys = true
26 isLenient = true
27 coerceInputValues = true
28 explicitNulls = false
29 classDiscriminator = "type"
30 serializersModule = SerializersModule {
31 polymorphicDefaultDeserializer(Part::class) { UnknownPart.serializer() }
32 polymorphicDefaultDeserializer(BusEvent::class) { UnknownEvent.serializer() }
33 polymorphicDefaultDeserializer(MessageInfo::class) { UnknownMessage.serializer() }
34 polymorphicDefaultDeserializer(ToolState::class) { ToolUnknown.serializer() }
35 }