1
0
mirror of https://github.com/InsanusMokrassar/TelegramBotAPI.git synced 2024-06-15 06:15:27 +00:00
tgbotapi/tgbotapi.core/src/commonMain/kotlin/dev/inmo/tgbotapi/types/update/abstracts/Update.kt

70 lines
2.3 KiB
Kotlin
Raw Normal View History

2020-10-04 11:06:30 +00:00
package dev.inmo.tgbotapi.types.update.abstracts
2018-12-26 08:07:24 +00:00
2022-08-05 18:39:46 +00:00
import dev.inmo.tgbotapi.utils.internal.ClassCastsIncluded
2024-03-16 14:32:18 +00:00
import dev.inmo.tgbotapi.types.UpdateId
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.types.update.RawUpdate
import dev.inmo.tgbotapi.types.updateIdField
2021-05-29 09:34:14 +00:00
import dev.inmo.tgbotapi.utils.RiskFeature
2020-10-04 11:06:30 +00:00
import dev.inmo.tgbotapi.utils.nonstrictJsonFormat
2019-08-17 16:08:36 +00:00
import kotlinx.serialization.*
2020-08-18 06:50:11 +00:00
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonPrimitive
import kotlinx.serialization.json.longOrNull
2018-12-26 08:07:24 +00:00
2022-08-05 10:31:39 +00:00
@ClassCastsIncluded
interface Update {
2024-03-16 14:32:18 +00:00
val updateId: UpdateId
val data: Any
2018-12-26 08:07:24 +00:00
}
2019-08-17 16:08:36 +00:00
2020-06-27 03:43:24 +00:00
data class UnknownUpdate(
2024-03-16 14:32:18 +00:00
override val updateId: UpdateId,
override val data: JsonElement,
val throwable: Throwable? = null
) : Update {
val rawJson: JsonElement
get() = data
}
2020-01-22 21:35:56 +00:00
2021-05-29 09:34:14 +00:00
@RiskFeature
object UpdateSerializerWithoutSerialization : KSerializer<Update> {
2020-08-18 06:50:11 +00:00
override val descriptor: SerialDescriptor = JsonElement.serializer().descriptor
2019-08-17 16:08:36 +00:00
override fun deserialize(decoder: Decoder): Update = UpdateDeserializationStrategy.deserialize(decoder)
2020-03-22 07:37:01 +00:00
override fun serialize(encoder: Encoder, value: Update) = throw UnsupportedOperationException()
2019-08-17 16:08:36 +00:00
}
/**
* Use this object to deserialize objects with type [Update]. Currently it is restricted to use this
* [DeserializationStrategy] only with JSON
*
* @see StringFormat.parse
* @see kotlinx.serialization.json.Json.parse
*/
object UpdateDeserializationStrategy : DeserializationStrategy<Update> {
2020-08-18 06:50:11 +00:00
override val descriptor: SerialDescriptor = JsonElement.serializer().descriptor
2019-08-17 16:08:36 +00:00
override fun deserialize(decoder: Decoder): Update {
2020-08-18 06:50:11 +00:00
val asJson = JsonElement.serializer().deserialize(decoder)
return runCatching {
nonstrictJsonFormat.decodeFromJsonElement(
RawUpdate.serializer(),
asJson
).asUpdate(
asJson
)
}.getOrElse {
UnknownUpdate(
2024-03-16 14:32:18 +00:00
UpdateId((asJson as? JsonObject) ?.get(updateIdField) ?.jsonPrimitive ?.longOrNull ?: -1L),
asJson,
it
)
}
2019-08-17 16:08:36 +00:00
}
}