Skip to content

Commit 9c745d9

Browse files
committed
Additional serializers for tgbotapi model
1 parent ff874bc commit 9c745d9

File tree

6 files changed

+132
-0
lines changed

6 files changed

+132
-0
lines changed

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ rootProject.name = "jprof_by_bot"
55

66
include(":utils:dynamodb")
77
include(":utils:aws-junit5")
8+
include(":utils:tgbotapi-serialization")
89
include(":votes")
910
include(":votes:dynamodb")
1011
include(":votes:tgbotapi-extensions")
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
plugins {
2+
kotlin("jvm")
3+
kotlin("plugin.serialization")
4+
}
5+
6+
dependencies {
7+
api(libs.tgbotapi.core)
8+
implementation(libs.kotlinx.serialization.core)
9+
10+
testImplementation(libs.junit.jupiter.api)
11+
testImplementation(libs.junit.jupiter.params)
12+
testRuntimeOnly(libs.junit.jupiter.engine)
13+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package by.jprof.telegram.bot.utils.tgbotapi_serialization
2+
3+
import by.jprof.telegram.bot.utils.tgbotapi_serialization.serializers.TextContentSerializer
4+
import dev.inmo.tgbotapi.types.message.content.TextContent
5+
import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent
6+
import kotlinx.serialization.modules.SerializersModule
7+
import kotlinx.serialization.modules.polymorphic
8+
9+
object TgBotAPI {
10+
val module = SerializersModule {
11+
polymorphic(MessageContent::class) {
12+
// subclass(AnimationContent::class, AnimationContentSerializer())
13+
// subclass(AudioContent::class, AudioContentSerializer())
14+
// subclass(AudioMediaGroupContent::class, AudioMediaGroupContentSerializer())
15+
// subclass(ContactContent::class, ContactContentSerializer())
16+
// subclass(DiceContent::class, DiceContentSerializer())
17+
// subclass(DocumentContent::class, DocumentContentSerializer())
18+
// subclass(DocumentMediaGroupContent::class, DocumentMediaGroupContentSerializer())
19+
// subclass(GameContent::class, GameContentSerializer())
20+
// subclass(InvoiceContent::class, InvoiceContentSerializer())
21+
// subclass(LocationContent::class, LocationContentSerializer())
22+
// subclass(MediaCollectionContent::class, MediaCollectionContentSerializer())
23+
// subclass(MediaContent::class, MediaContentSerializer())
24+
// subclass(MediaGroupContent::class, MediaGroupContentSerializer())
25+
// subclass(PhotoContent::class, PhotoContentSerializer())
26+
// subclass(PollContent::class, PollContentSerializer())
27+
// subclass(StickerContent::class, StickerContentSerializer())
28+
subclass(TextContent::class, TextContentSerializer())
29+
// subclass(VenueContent::class, VenueContentSerializer())
30+
// subclass(VideoContent::class, VideoContentSerializer())
31+
// subclass(VideoNoteContent::class, VideoNoteContentSerializer())
32+
// subclass(VisualMediaGroupContent::class, VisualMediaGroupContentSerializer())
33+
// subclass(VoiceContent::class, VoiceContentSerializer())
34+
}
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package by.jprof.telegram.bot.utils.tgbotapi_serialization.serializers
2+
3+
import by.jprof.telegram.bot.utils.tgbotapi_serialization.surrogates.TextContentSurrogate
4+
import dev.inmo.tgbotapi.types.message.content.TextContent
5+
import kotlinx.serialization.KSerializer
6+
import kotlinx.serialization.descriptors.SerialDescriptor
7+
import kotlinx.serialization.encoding.Decoder
8+
import kotlinx.serialization.encoding.Encoder
9+
10+
internal class TextContentSerializer : KSerializer<TextContent> {
11+
override val descriptor: SerialDescriptor = TextContentSurrogate.serializer().descriptor
12+
13+
override fun serialize(encoder: Encoder, value: TextContent) {
14+
val surrogate = TextContentSurrogate(
15+
text = value.text,
16+
textSources = value.textSources,
17+
)
18+
19+
encoder.encodeSerializableValue(TextContentSurrogate.serializer(), surrogate)
20+
}
21+
22+
override fun deserialize(decoder: Decoder): TextContent {
23+
val surrogate = decoder.decodeSerializableValue(TextContentSurrogate.serializer())
24+
25+
return TextContent(
26+
text = surrogate.text,
27+
textSources = surrogate.textSources,
28+
)
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package by.jprof.telegram.bot.utils.tgbotapi_serialization.surrogates
2+
3+
import dev.inmo.tgbotapi.types.MessageEntity.textsources.TextSourcesList
4+
import kotlinx.serialization.SerialName
5+
import kotlinx.serialization.Serializable
6+
7+
@Serializable
8+
@SerialName("TextContent")
9+
internal data class TextContentSurrogate(
10+
val text: String,
11+
val textSources: TextSourcesList = emptyList()
12+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package by.jprof.telegram.bot.utils.tgbotapi_serialization
2+
3+
import dev.inmo.tgbotapi.types.MessageEntity.textsources.BotCommandTextSource
4+
import dev.inmo.tgbotapi.types.MessageEntity.textsources.RegularTextSource
5+
import dev.inmo.tgbotapi.types.message.content.TextContent
6+
import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent
7+
import kotlinx.serialization.decodeFromString
8+
import kotlinx.serialization.encodeToString
9+
import kotlinx.serialization.json.Json
10+
import org.junit.jupiter.api.Assertions
11+
import org.junit.jupiter.api.Test
12+
13+
internal class TextContentSerializerTest {
14+
private val json = Json { serializersModule = TgBotAPI.module }
15+
private val textContent = TextContent(
16+
text = "/start up",
17+
textSources = listOf(
18+
BotCommandTextSource(source = "/start"),
19+
RegularTextSource(source = " up")
20+
)
21+
)
22+
private val serialized =
23+
"{\"type\":\"TextContent\",\"text\":\"/start up\",\"textSources\":[{\"type\":\"bot_command\",\"value\":{\"source\":\"/start\"}},{\"type\":\"regular\",\"value\":{\"source\":\" up\"}}]}"
24+
25+
@Test
26+
fun serialize() {
27+
Assertions.assertEquals(
28+
serialized,
29+
json.encodeToString<MessageContent>(textContent)
30+
)
31+
}
32+
33+
@Test
34+
fun deserialize() {
35+
Assertions.assertEquals(
36+
textContent,
37+
json.decodeFromString<MessageContent>(serialized)
38+
)
39+
}
40+
}

0 commit comments

Comments
 (0)