mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-25 15:40:28 +08:00
value delegating
This commit is contained in:
parent
ecd41bc4e0
commit
2c09f1d82d
@ -23,7 +23,15 @@ import kotlin.reflect.typeOf
|
||||
|
||||
// TODO: 2020/6/21 move to JvmPlugin to inherit SettingStorage and CoroutineScope for saving
|
||||
// Shows public APIs such as deciding when to auto-save.
|
||||
abstract class Setting : SettingImpl()
|
||||
abstract class Setting : SettingImpl() {
|
||||
|
||||
operator fun <T> Value<T>.provideDelegate(thisRef: Any?, property: KProperty<*>): Value<T> {
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
valueNodes.add(Node(property as KProperty<T>, value as Value<T>, TODO()))
|
||||
// TODO: 2020/6/21 track on
|
||||
return this
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal implementation for [Setting] including:
|
||||
@ -32,13 +40,13 @@ abstract class Setting : SettingImpl()
|
||||
*/
|
||||
// TODO move to internal package.
|
||||
internal abstract class SettingImpl {
|
||||
private class Node<T>(
|
||||
internal class Node<T>(
|
||||
val property: KProperty<T>,
|
||||
val value: Value<T>,
|
||||
val serializer: ValueSerializer<T>
|
||||
)
|
||||
|
||||
private val valueNodes: List<Node<*>> = kotlin.run {
|
||||
internal val valueNodes: MutableList<Node<*>> = kotlin.run {
|
||||
TODO("reflection")
|
||||
}
|
||||
|
||||
|
@ -7,12 +7,13 @@
|
||||
* https://github.com/mamoe/mirai/blob/master/LICENSE
|
||||
*/
|
||||
|
||||
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "unused")
|
||||
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER", "unused", "NOTHING_TO_INLINE")
|
||||
|
||||
package net.mamoe.mirai.console.setting
|
||||
|
||||
import kotlinx.serialization.KSerializer
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
/**
|
||||
* Represents a observable, immutable value wrapping.
|
||||
@ -28,6 +29,11 @@ interface Value<T> {
|
||||
var value: T
|
||||
}
|
||||
|
||||
inline operator fun <T> Value<T>.getValue(mySetting: Any?, property: KProperty<*>): T = value
|
||||
inline operator fun <T> Value<T>.setValue(mySetting: Any?, property: KProperty<*>, value: T) {
|
||||
this.value = value
|
||||
}
|
||||
|
||||
/**
|
||||
* The serializer for a specific kind of [Value].
|
||||
*/
|
||||
|
@ -10,11 +10,6 @@
|
||||
package net.mamoe.mirai.console.setting.internal
|
||||
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.ListSerializer
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
import net.mamoe.mirai.utils.MiraiExperimentalAPI
|
||||
import net.mamoe.yamlkt.Yaml
|
||||
import net.mamoe.yamlkt.YamlConfiguration
|
||||
import kotlin.reflect.KProperty
|
||||
import kotlin.reflect.full.findAnnotation
|
||||
|
||||
|
@ -13,6 +13,12 @@ import org.junit.jupiter.api.Test
|
||||
|
||||
internal class SettingTest {
|
||||
|
||||
class MySetting : Setting() {
|
||||
val int by value(1)
|
||||
val map by valueReified(mapOf("" to ""))
|
||||
val map2 by valueReified(mapOf("" to mapOf("" to mapOf("" to ""))))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPrimitive() {
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user