first version

This commit is contained in:
2020-11-12 11:52:09 +06:00
parent 9b46894d99
commit e93704f511
13 changed files with 151 additions and 55 deletions

View File

@@ -0,0 +1,42 @@
package dev.inmo.plagubot.config
import com.github.matfax.klassindex.KlassIndex
import dev.inmo.plagubot.Plugin
import kotlinx.serialization.*
import kotlinx.serialization.json.Json
import kotlinx.serialization.modules.*
import kotlin.reflect.KClass
@InternalSerializationApi
internal inline fun <T : Plugin> KClass<T>.includeIn(builder: PolymorphicModuleBuilder<Plugin>) = builder.subclass(this, serializer())
@InternalSerializationApi
internal val configSerialFormat: StringFormat
get() = Json {
ignoreUnknownKeys = true
serializersModule = SerializersModule {
polymorphic(Plugin::class) {
KlassIndex.getSubclasses(Plugin::class).flatMap { kclass ->
kclass.includeIn(this)
kclass.annotations.mapNotNull { it as? SerialName }.map {
it.value to kclass.serializer()
} + listOfNotNull(
kclass.simpleName ?.let {
it to kclass.serializer()
}
)
}.toMap().let {
default { requiredType ->
it[requiredType]
}
}
}
}
}
@Serializable
data class Config(
val plugins: List<@Contextual Plugin>,
val database: DatabaseConfig,
val botToken: String
)

View File

@@ -0,0 +1,40 @@
package dev.inmo.plagubot.config
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.transactions.transactionManager
import org.sqlite.JDBC
import java.sql.Connection
@Serializable
data class DatabaseConfig(
val url: String = "jdbc:sqlite:file:test?mode=memory&cache=shared",
val driver: String = JDBC::class.qualifiedName!!,
val username: String = "",
val password: String = "",
val initAutomatically: Boolean = true
) {
@Transient
private lateinit var _database: Database
val database: Database
get() = try {
_database
} catch (e: UninitializedPropertyAccessException) {
Database.connect(
url,
driver,
username,
password
).also {
_database = it
it.transactionManager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE // Or Connection.TRANSACTION_READ_UNCOMMITTED
}
}
init {
if (initAutomatically) {
database // init database
}
}
}