package dev.inmo.plaguposter.settings.exposed import dev.inmo.micro_utils.repos.KeyValueRepo import dev.inmo.micro_utils.repos.exposed.keyvalue.ExposedKeyValueRepo import dev.inmo.micro_utils.repos.mappers.withMapper import dev.inmo.plaguposter.settings.repo.SettingsRepo import dev.inmo.tgbotapi.types.ChatId import kotlinx.serialization.* import kotlinx.serialization.json.Json import org.jetbrains.exposed.sql.Database class ExposedSettingsRepo( parent: KeyValueRepo ) : SettingsRepo, KeyValueRepo by parent @OptIn(InternalSerializationApi::class) inline fun ExposedSettingsRepo( parent: KeyValueRepo, json: Json, serializer: KSerializer = T::class.serializer() ) = ExposedSettingsRepo( parent.withMapper( { chatId }, { json.encodeToString(serializer, this) }, { ChatId(this) }, { json.decodeFromString(serializer, this) } ) ) @OptIn(InternalSerializationApi::class) inline fun ExposedSettingsRepo( database: Database, json: Json, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = ExposedSettingsRepo( ExposedKeyValueRepo( database, { long("chat_id") }, { text("settings") }, tableName ), json, serializer ) @OptIn(InternalSerializationApi::class) inline fun SettingsRepo( parent: KeyValueRepo, json: Json, serializer: KSerializer = T::class.serializer() ) = ExposedSettingsRepo(parent, json, serializer) @OptIn(InternalSerializationApi::class) inline fun SettingsRepo( database: Database, json: Json, serializer: KSerializer = T::class.serializer(), tableName: String = "settings_${T::class.simpleName!!}" ) = ExposedSettingsRepo(database, json, serializer, tableName)