Move a big part of the getValue method body to a new function called convertValue, to avoid code duplication
This commit is contained in:
parent
7573114c6a
commit
74df5b8639
|
@ -28,6 +28,8 @@ import kotlinx.serialization.ExperimentalSerializationApi
|
|||
import kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
import org.jetbrains.annotations.ApiStatus
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.full.isSuperclassOf
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
|
@ -133,27 +135,33 @@ object Configuration {
|
|||
}
|
||||
|
||||
operator fun invoke() = obtained
|
||||
inline operator fun <reified T> getValue(ref: Any?, property: KProperty<*>): T =
|
||||
@JvmSynthetic
|
||||
@ApiStatus.Internal
|
||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
||||
@Deprecated("This method should only be used in the getValue operator of the Configuration object", level = DeprecationLevel.ERROR)
|
||||
fun <T: Any> convertValue(type: KClass<T>): T? =
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
when {
|
||||
Number::class.isSuperclassOf(type) -> when (type) {
|
||||
Double::class -> 2.0
|
||||
Int::class, UInt::class,
|
||||
Short::class, UShort::class,
|
||||
Long::class, ULong::class -> 2
|
||||
Float::class -> 2F
|
||||
else -> null
|
||||
} as T
|
||||
type == Boolean::class -> false as T
|
||||
else -> null
|
||||
}
|
||||
inline operator fun <reified T: Any> getValue(ref: Any?, property: KProperty<*>): T =
|
||||
@Suppress("DEPRECATION_ERROR")
|
||||
if (ModifiableValues.containsKey(property.name))
|
||||
ModifiableValues[property.name] as T
|
||||
else try {
|
||||
invoke().getValue(ref, property)
|
||||
} catch (e: ConfigException) {
|
||||
when {
|
||||
Number::class.isSuperclassOf(T::class) -> when (T::class) {
|
||||
Double::class -> 2.0
|
||||
Int::class, UInt::class,
|
||||
Short::class, UShort::class,
|
||||
Long::class, ULong::class -> 2
|
||||
Float::class -> 2F
|
||||
else -> throw e
|
||||
} as T
|
||||
T::class == Boolean::class -> false as T
|
||||
else -> throw e
|
||||
}
|
||||
convertValue(T::class) ?: throw e
|
||||
}
|
||||
|
||||
operator fun <T> setValue(ref: Any?, property: KProperty<*>, value: T) = @Suppress("DEPRECATION_ERROR")
|
||||
ModifiableValues.setValue(ref, property, value)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue