TelegramBotApiLibraries/cache/content/micro_utils/src/commonMain/kotlin/dev/inmo/tgbotapi/libraries/cache/media/micro_utils/SimpleKeyValueMessageContentCache.kt

94 lines
3.9 KiB
Kotlin
Raw Normal View History

2022-03-22 12:52:23 +00:00
package dev.inmo.tgbotapi.libraries.cache.media.micro_utils
import dev.inmo.micro_utils.repos.*
import dev.inmo.micro_utils.repos.mappers.withMapper
2022-04-11 15:28:53 +00:00
import dev.inmo.tgbotapi.libraries.cache.media.common.MessagesSimpleCache
2022-03-22 12:52:23 +00:00
import dev.inmo.tgbotapi.types.ChatId
import dev.inmo.tgbotapi.types.MessageIdentifier
2022-05-17 14:05:53 +00:00
import dev.inmo.tgbotapi.types.message.content.MessageContent
2022-03-22 12:52:23 +00:00
import kotlinx.serialization.*
import kotlinx.serialization.builtins.PairSerializer
import kotlinx.serialization.builtins.serializer
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.SerializersModule
import kotlin.js.JsName
import kotlin.jvm.JvmName
2022-04-11 17:32:06 +00:00
class SimpleKeyValueMessageContentCache<K>(
2022-05-17 14:05:53 +00:00
private val keyValueRepo: KeyValueRepo<K, MessageContent>
2022-04-11 17:32:06 +00:00
) : MessagesSimpleCache<K> {
2022-05-17 14:05:53 +00:00
override suspend fun set(k: K, content: MessageContent) {
keyValueRepo.set(k, content)
2022-04-11 17:32:06 +00:00
}
override suspend fun update(k: K, content: MessageContent): Boolean {
return keyValueRepo.runCatching {
if (contains(k)) {
keyValueRepo.set(k, content)
true
} else {
false
}
}.getOrDefault(false)
}
override suspend fun get(k: K): MessageContent? {
return keyValueRepo.get(k)
2022-03-22 12:52:23 +00:00
}
2022-04-11 17:32:06 +00:00
override suspend fun contains(k: K): Boolean {
return keyValueRepo.contains(k)
2022-03-22 12:52:23 +00:00
}
2022-04-11 17:32:06 +00:00
override suspend fun remove(k: K) {
keyValueRepo.unset(k)
2022-03-22 12:52:23 +00:00
}
}
val chatIdToMessageIdentifierSerializer = PairSerializer(
ChatId.serializer(),
MessageIdentifier.serializer()
)
val messageContentSerializer = PolymorphicSerializer<MessageContent>(MessageContent::class)
inline fun KeyValueRepo<String, String>.asMessageContentCache(
serialFormatCreator: (SerializersModule) -> StringFormat = { Json { serializersModule = it } }
): StandardKeyValueRepo<Pair<ChatId, MessageIdentifier>, MessageContent> {
val serialFormat = serialFormatCreator(MessageContent.serializationModule())
return withMapper<Pair<ChatId, MessageIdentifier>, MessageContent, String, String>(
{ serialFormat.encodeToString(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.encodeToString(messageContentSerializer, this) },
{ serialFormat.decodeFromString(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.decodeFromString(messageContentSerializer, this) },
)
}
@JvmName("stringsKeyValueAsHexMessageContentCache")
@JsName("stringsKeyValueAsHexMessageContentCache")
inline fun KeyValueRepo<String, String>.asMessageContentCache(
serialFormatCreator: (SerializersModule) -> BinaryFormat
): StandardKeyValueRepo<Pair<ChatId, MessageIdentifier>, MessageContent> {
val serialFormat = serialFormatCreator(MessageContent.serializationModule())
return withMapper<Pair<ChatId, MessageIdentifier>, MessageContent, String, String>(
{ serialFormat.encodeToHexString(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.encodeToHexString(messageContentSerializer, this) },
{ serialFormat.decodeFromHexString(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.decodeFromHexString(messageContentSerializer, this) },
)
}
@JvmName("bytesKeyValueAsMessageContentCache")
@JsName("bytesKeyValueAsMessageContentCache")
inline fun KeyValueRepo<ByteArray, ByteArray>.asMessageContentCache(
serialFormatCreator: (SerializersModule) -> BinaryFormat
): StandardKeyValueRepo<Pair<ChatId, MessageIdentifier>, MessageContent> {
val serialFormat = serialFormatCreator(MessageContent.serializationModule())
return withMapper<Pair<ChatId, MessageIdentifier>, MessageContent, ByteArray, ByteArray>(
{ serialFormat.encodeToByteArray(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.encodeToByteArray(messageContentSerializer, this) },
{ serialFormat.decodeFromByteArray(chatIdToMessageIdentifierSerializer, this) },
{ serialFormat.decodeFromByteArray(messageContentSerializer, this) },
)
}