mirror of
https://github.com/mamoe/mirai.git
synced 2025-01-25 15:40:28 +08:00
Support custom data classes in PluginData
This commit is contained in:
parent
16242c9a93
commit
73c28c6cbf
@ -362,5 +362,3 @@ internal fun <T> PluginData.valueImpl(type: KType, classifier: KClass<*>): Seria
|
|||||||
@ConsoleExperimentalAPI
|
@ConsoleExperimentalAPI
|
||||||
public fun <T> PluginData.valueFromKType(type: KType, default: T): SerializerAwareValue<T> =
|
public fun <T> PluginData.valueFromKType(type: KType, default: T): SerializerAwareValue<T> =
|
||||||
(valueFromKTypeImpl(type) as SerializerAwareValue<Any?>).apply { this.value = default } as SerializerAwareValue<T>
|
(valueFromKTypeImpl(type) as SerializerAwareValue<Any?>).apply { this.value = default } as SerializerAwareValue<T>
|
||||||
|
|
||||||
// TODO: 2020/6/24 Introduce class TypeToken for compound types for Java.
|
|
@ -189,6 +189,7 @@ public interface ListValue<E> : CompositeValue<List<E>>
|
|||||||
*
|
*
|
||||||
* @param E 不是基础数据类型
|
* @param E 不是基础数据类型
|
||||||
*/
|
*/
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface CompositeListValue<E> : ListValue<E>
|
public interface CompositeListValue<E> : ListValue<E>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -196,12 +197,16 @@ public interface CompositeListValue<E> : ListValue<E>
|
|||||||
*
|
*
|
||||||
* @param E 是基础类型
|
* @param E 是基础类型
|
||||||
*/
|
*/
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveListValue<E> : ListValue<E>
|
public interface PrimitiveListValue<E> : ListValue<E>
|
||||||
|
|
||||||
|
|
||||||
//// region PrimitiveListValue CODEGEN ////
|
//// region PrimitiveListValue CODEGEN ////
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveIntListValue : PrimitiveListValue<Int>
|
public interface PrimitiveIntListValue : PrimitiveListValue<Int>
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveLongListValue : PrimitiveListValue<Long>
|
public interface PrimitiveLongListValue : PrimitiveListValue<Long>
|
||||||
// TODO + codegen
|
// TODO + codegen
|
||||||
|
|
||||||
@ -212,24 +217,30 @@ public interface PrimitiveLongListValue : PrimitiveListValue<Long>
|
|||||||
* @see [CompositeSetValue]
|
* @see [CompositeSetValue]
|
||||||
* @see [PrimitiveSetValue]
|
* @see [PrimitiveSetValue]
|
||||||
*/
|
*/
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface SetValue<E> : CompositeValue<Set<E>>
|
public interface SetValue<E> : CompositeValue<Set<E>>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复合数据类型 [Set]
|
* 复合数据类型 [Set]
|
||||||
* @param E 是基础数据类型
|
* @param E 是基础数据类型
|
||||||
*/
|
*/
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface CompositeSetValue<E> : SetValue<E>
|
public interface CompositeSetValue<E> : SetValue<E>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 基础数据类型 [Set]
|
* 基础数据类型 [Set]
|
||||||
* @param E 是基础数据类型
|
* @param E 是基础数据类型
|
||||||
*/
|
*/
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveSetValue<E> : SetValue<E>
|
public interface PrimitiveSetValue<E> : SetValue<E>
|
||||||
|
|
||||||
|
|
||||||
//// region PrimitiveSetValue CODEGEN ////
|
//// region PrimitiveSetValue CODEGEN ////
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveIntSetValue : PrimitiveSetValue<Int>
|
public interface PrimitiveIntSetValue : PrimitiveSetValue<Int>
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveLongSetValue : PrimitiveSetValue<Long>
|
public interface PrimitiveLongSetValue : PrimitiveSetValue<Long>
|
||||||
// TODO + codegen
|
// TODO + codegen
|
||||||
|
|
||||||
@ -252,17 +263,15 @@ public interface PrimitiveMapValue<K, V> : MapValue<K, V>
|
|||||||
|
|
||||||
//// region PrimitiveMapValue CODEGEN ////
|
//// region PrimitiveMapValue CODEGEN ////
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveIntIntMapValue : PrimitiveMapValue<Int, Int>
|
public interface PrimitiveIntIntMapValue : PrimitiveMapValue<Int, Int>
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
public interface PrimitiveIntLongMapValue : PrimitiveMapValue<Int, Long>
|
public interface PrimitiveIntLongMapValue : PrimitiveMapValue<Int, Long>
|
||||||
// TODO + codegen
|
// TODO + codegen
|
||||||
|
|
||||||
//// endregion PrimitiveSetValue CODEGEN ////
|
//// endregion PrimitiveSetValue CODEGEN ////
|
||||||
|
|
||||||
|
|
||||||
|
@ConsoleExperimentalAPI
|
||||||
|
public interface ReferenceValue<T> : Value<T>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -14,8 +14,8 @@ import java.time.Instant
|
|||||||
|
|
||||||
internal object MiraiConsoleBuildConstants { // auto-filled on build (task :mirai-console:fillBuildConstants)
|
internal object MiraiConsoleBuildConstants { // auto-filled on build (task :mirai-console:fillBuildConstants)
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
val buildDate: Instant = Instant.ofEpochSecond(0)
|
val buildDate: Instant = Instant.ofEpochSecond(1598539421)
|
||||||
|
|
||||||
@JvmStatic
|
@JvmStatic
|
||||||
val version: Semver = Semver("0", Semver.SemverType.LOOSE)
|
val version: Semver = Semver("1.0-M3-1", Semver.SemverType.LOOSE)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ package net.mamoe.mirai.console.internal.data
|
|||||||
|
|
||||||
import kotlinx.serialization.builtins.serializer
|
import kotlinx.serialization.builtins.serializer
|
||||||
import net.mamoe.mirai.console.data.PluginData
|
import net.mamoe.mirai.console.data.PluginData
|
||||||
|
import net.mamoe.mirai.console.data.ReferenceValue
|
||||||
import net.mamoe.mirai.console.data.SerializerAwareValue
|
import net.mamoe.mirai.console.data.SerializerAwareValue
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
@ -180,3 +181,19 @@ internal fun PluginData.stringValueImpl(): SerializerAwareValue<String> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//// endregion PluginData_value_PrimitivesImpl CODEGEN ////
|
//// endregion PluginData_value_PrimitivesImpl CODEGEN ////
|
||||||
|
|
||||||
|
internal class LazyReferenceValueImpl<T> : ReferenceValue<T>, AbstractValueImpl<T>() {
|
||||||
|
private var initialied: Boolean = false
|
||||||
|
private var valueField: T? = null
|
||||||
|
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
override var value: T
|
||||||
|
get() {
|
||||||
|
check(initialied) { "Internal error: LazyReferenceValueImpl.valueField isn't initialized" }
|
||||||
|
return valueField as T
|
||||||
|
}
|
||||||
|
set(value) {
|
||||||
|
initialied = true
|
||||||
|
valueField = value
|
||||||
|
}
|
||||||
|
}
|
@ -25,7 +25,8 @@ internal abstract class AbstractValueImpl<T> : Value<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal fun <T> Value<T>.setValueBySerializer(value: T) = (this as AbstractValueImpl<T>).setValueBySerializer(value)
|
internal fun <T> Value<T>.setValueBySerializer(value: T) =
|
||||||
|
(this.castOrInternalError<AbstractValueImpl<T>>()).setValueBySerializer(value)
|
||||||
|
|
||||||
//// region PrimitiveValuesImpl CODEGEN ////
|
//// region PrimitiveValuesImpl CODEGEN ////
|
||||||
|
|
||||||
|
@ -96,7 +96,10 @@ internal fun PluginData.valueFromKTypeImpl(type: KType): SerializerAwareValue<*>
|
|||||||
.serializableValueWith(serializerMirai(type) as KSerializer<Set<Any?>>)
|
.serializableValueWith(serializerMirai(type) as KSerializer<Set<Any?>>)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else -> error("Custom composite value is not supported yet (${classifier.qualifiedName})")
|
else -> {
|
||||||
|
val serializer = serializerMirai(type)
|
||||||
|
return LazyReferenceValueImpl<Any?>().serializableValueWith(serializer)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user