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
|
2020-10-04 11:06:30 +00:00
|
|
|
import dev.inmo.tgbotapi.types.UpdateIdentifier
|
|
|
|
import dev.inmo.tgbotapi.types.update.RawUpdate
|
2023-06-30 10:35:14 +00:00
|
|
|
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
|
2020-04-13 05:17:15 +00:00
|
|
|
import kotlinx.serialization.json.JsonElement
|
2023-06-30 10:35:14 +00:00
|
|
|
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
|
2019-01-21 06:13:31 +00:00
|
|
|
interface Update {
|
2018-12-26 08:07:24 +00:00
|
|
|
val updateId: UpdateIdentifier
|
2019-01-21 06:13:31 +00:00
|
|
|
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(
|
2020-01-22 21:35:56 +00:00
|
|
|
override val updateId: UpdateIdentifier,
|
2023-06-30 10:35:14 +00:00
|
|
|
override val data: JsonElement,
|
|
|
|
val throwable: Throwable? = null
|
|
|
|
) : Update {
|
2020-04-13 05:17:15 +00:00
|
|
|
val rawJson: JsonElement
|
2023-06-30 10:35:14 +00:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2020-05-13 13:53:27 +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)
|
2023-06-30 10:35:14 +00:00
|
|
|
return runCatching {
|
|
|
|
nonstrictJsonFormat.decodeFromJsonElement(
|
|
|
|
RawUpdate.serializer(),
|
|
|
|
asJson
|
|
|
|
).asUpdate(
|
|
|
|
asJson
|
|
|
|
)
|
|
|
|
}.getOrElse {
|
|
|
|
UnknownUpdate(
|
|
|
|
(asJson as? JsonObject) ?.get(updateIdField) ?.jsonPrimitive ?.longOrNull ?: -1L,
|
|
|
|
asJson,
|
|
|
|
it
|
|
|
|
)
|
|
|
|
}
|
2019-08-17 16:08:36 +00:00
|
|
|
}
|
|
|
|
}
|