1package com.peachpasswords.vault23import kotlinx.serialization.KSerializer4import kotlinx.serialization.descriptors.PrimitiveKind5import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor6import kotlinx.serialization.descriptors.SerialDescriptor7import kotlinx.serialization.encoding.Decoder8import kotlinx.serialization.encoding.Encoder9import kotlinx.serialization.json.Json10import kotlinx.serialization.json.JsonDecoder11import kotlinx.serialization.json.JsonEncoder12import kotlinx.serialization.json.JsonObject13import kotlinx.serialization.json.JsonPrimitive1415161718192021222324252627282930object JwkStringSerializer : KSerializer<String> {31 override val descriptor: SerialDescriptor =32 PrimitiveSerialDescriptor("com.peachpasswords.vault.JwkString", PrimitiveKind.STRING)3334 private val json = Json { encodeDefaults = true }3536 override fun deserialize(decoder: Decoder): String {37 val input = decoder as? JsonDecoder ?: return decoder.decodeString()38 return when (val element = input.decodeJsonElement()) {39 is JsonPrimitive -> if (element.isString) element.content else element.toString()40 else -> element.toString()41 }42 }4344 override fun serialize(encoder: Encoder, value: String) {45 val output = encoder as? JsonEncoder ?: return encoder.encodeString(value)46 47 48 val element = runCatching { json.parseToJsonElement(value) }.getOrNull()49 if (element is JsonObject) output.encodeJsonElement(element) else output.encodeString(value)50 }51}