Move KSerializer.map to mirai-core-utils

This commit is contained in:
Him188 2021-07-04 17:56:04 +08:00
parent 4c810ee3ee
commit 7722a5a0b0
6 changed files with 52 additions and 58 deletions

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2019-2021 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/dev/LICENSE
*/ */
package net.mamoe.mirai.internal.message package net.mamoe.mirai.internal.message
@ -12,9 +12,7 @@ package net.mamoe.mirai.internal.message
import kotlinx.serialization.KSerializer import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.* import kotlinx.serialization.descriptors.buildClassSerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.modules.PolymorphicModuleBuilder import kotlinx.serialization.modules.PolymorphicModuleBuilder
import kotlinx.serialization.modules.SerializersModule import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.overwriteWith import kotlinx.serialization.modules.overwriteWith
@ -23,6 +21,7 @@ import net.mamoe.mirai.Mirai
import net.mamoe.mirai.message.MessageSerializers import net.mamoe.mirai.message.MessageSerializers
import net.mamoe.mirai.message.data.* import net.mamoe.mirai.message.data.*
import net.mamoe.mirai.utils.MiraiInternalApi import net.mamoe.mirai.utils.MiraiInternalApi
import net.mamoe.mirai.utils.map
import net.mamoe.mirai.utils.takeElementsFrom import net.mamoe.mirai.utils.takeElementsFrom
import kotlin.reflect.KClass import kotlin.reflect.KClass
import kotlin.reflect.full.allSuperclasses import kotlin.reflect.full.allSuperclasses
@ -217,33 +216,4 @@ internal object MessageSerializersImpl : MessageSerializers {
override fun registerSerializers(serializersModule: SerializersModule) { override fun registerSerializers(serializersModule: SerializersModule) {
serializersModuleField = serializersModule.overwriteWith(serializersModule) serializersModuleField = serializersModule.overwriteWith(serializersModule)
} }
}
internal inline fun <T, R> KSerializer<T>.map(
resultantDescriptor: SerialDescriptor,
crossinline deserialize: T.(T) -> R,
crossinline serialize: R.(R) -> T,
): KSerializer<R> {
return object : KSerializer<R> {
override val descriptor: SerialDescriptor get() = resultantDescriptor
override fun deserialize(decoder: Decoder): R = this@map.deserialize(decoder).let { deserialize(it, it) }
override fun serialize(encoder: Encoder, value: R) = serialize(encoder, value.let { serialize(it, it) })
}
}
internal inline fun <T, R> KSerializer<T>.mapPrimitive(
serialName: String,
crossinline deserialize: (T) -> R,
crossinline serialize: R.(R) -> T,
): KSerializer<R> {
val kind = this@mapPrimitive.descriptor.kind
check(kind is PrimitiveKind) { "kind must be PrimitiveKind but found $kind" }
return object : KSerializer<R> {
override fun deserialize(decoder: Decoder): R =
this@mapPrimitive.deserialize(decoder).let(deserialize)
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(serialName, kind)
override fun serialize(encoder: Encoder, value: R) =
this@mapPrimitive.serialize(encoder, value.let { serialize(it, it) })
}
} }

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2019-2021 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/dev/LICENSE
*/ */
@file:Suppress("NOTHING_TO_INLINE") @file:Suppress("NOTHING_TO_INLINE")
@ -20,7 +20,6 @@ import net.mamoe.kjbb.JvmBlockingBridge
import net.mamoe.mirai.Mirai import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.FileSupported import net.mamoe.mirai.contact.FileSupported
import net.mamoe.mirai.event.events.MessageEvent import net.mamoe.mirai.event.events.MessageEvent
import net.mamoe.mirai.internal.message.map
import net.mamoe.mirai.message.code.CodableMessage import net.mamoe.mirai.message.code.CodableMessage
import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode import net.mamoe.mirai.message.code.internal.appendStringAsMiraiCode
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2019-2021 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/dev/LICENSE
*/ */
@file:JvmMultifileClass @file:JvmMultifileClass
@ -31,18 +31,14 @@ import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.Contact import net.mamoe.mirai.contact.Contact
import net.mamoe.mirai.contact.Contact.Companion.sendImage import net.mamoe.mirai.contact.Contact.Companion.sendImage
import net.mamoe.mirai.contact.Contact.Companion.uploadImage import net.mamoe.mirai.contact.Contact.Companion.uploadImage
import net.mamoe.mirai.internal.message.map
import net.mamoe.mirai.internal.message.mapPrimitive
import net.mamoe.mirai.message.code.CodableMessage import net.mamoe.mirai.message.code.CodableMessage
import net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX import net.mamoe.mirai.message.data.Image.Key.IMAGE_ID_REGEX
import net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_1 import net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_1
import net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_2 import net.mamoe.mirai.message.data.Image.Key.IMAGE_RESOURCE_ID_REGEX_2
import net.mamoe.mirai.message.data.Image.Key.queryUrl import net.mamoe.mirai.message.data.Image.Key.queryUrl
import net.mamoe.mirai.utils.ExternalResource import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo import net.mamoe.mirai.utils.ExternalResource.Companion.sendAsImageTo
import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsImage
import net.mamoe.mirai.utils.MiraiInternalApi
import net.mamoe.mirai.utils.safeCast
import kotlin.LazyThreadSafetyMode.NONE import kotlin.LazyThreadSafetyMode.NONE
/** /**

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2019-2021 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/dev/LICENSE
*/ */
@ -19,9 +19,9 @@ import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import net.mamoe.mirai.IMirai import net.mamoe.mirai.IMirai
import net.mamoe.mirai.Mirai import net.mamoe.mirai.Mirai
import net.mamoe.mirai.internal.message.map
import net.mamoe.mirai.utils.chunkedHexToBytes import net.mamoe.mirai.utils.chunkedHexToBytes
import net.mamoe.mirai.utils.copy import net.mamoe.mirai.utils.copy
import net.mamoe.mirai.utils.map
import net.mamoe.mirai.utils.toUHexString import net.mamoe.mirai.utils.toUHexString
/** /**

View File

@ -1,10 +1,10 @@
/* /*
* Copyright 2019-2021 Mamoe Technologies and contributors. * Copyright 2019-2021 Mamoe Technologies and contributors.
* *
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link.
* *
* https://github.com/mamoe/mirai/blob/master/LICENSE * https://github.com/mamoe/mirai/blob/dev/LICENSE
*/ */
package net.mamoe.mirai.message.data package net.mamoe.mirai.message.data
@ -15,7 +15,6 @@ import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient import kotlinx.serialization.Transient
import net.mamoe.mirai.Mirai import net.mamoe.mirai.Mirai
import net.mamoe.mirai.contact.Group import net.mamoe.mirai.contact.Group
import net.mamoe.mirai.internal.message.map
import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.*
import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsVoice import net.mamoe.mirai.utils.ExternalResource.Companion.uploadAsVoice

View File

@ -15,10 +15,11 @@ package net.mamoe.mirai.utils
import kotlinx.serialization.BinaryFormat import kotlinx.serialization.BinaryFormat
import kotlinx.serialization.DeserializationStrategy import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.KSerializer
import kotlinx.serialization.StringFormat import kotlinx.serialization.StringFormat
import kotlinx.serialization.descriptors.ClassSerialDescriptorBuilder import kotlinx.serialization.descriptors.*
import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.descriptors.buildClassSerialDescriptor import kotlinx.serialization.encoding.Encoder
import java.io.File import java.io.File
public fun <T> File.loadNotBlankAs( public fun <T> File.loadNotBlankAs(
@ -57,3 +58,32 @@ public fun ClassSerialDescriptorBuilder.takeElementsFrom(descriptor: SerialDescr
} }
} }
} }
public inline fun <T, R> KSerializer<T>.map(
resultantDescriptor: SerialDescriptor,
crossinline deserialize: T.(T) -> R,
crossinline serialize: R.(R) -> T,
): KSerializer<R> {
return object : KSerializer<R> {
override val descriptor: SerialDescriptor get() = resultantDescriptor
override fun deserialize(decoder: Decoder): R = this@map.deserialize(decoder).let { deserialize(it, it) }
override fun serialize(encoder: Encoder, value: R) = serialize(encoder, value.let { serialize(it, it) })
}
}
public inline fun <T, R> KSerializer<T>.mapPrimitive(
serialName: String,
crossinline deserialize: (T) -> R,
crossinline serialize: R.(R) -> T,
): KSerializer<R> {
val kind = this@mapPrimitive.descriptor.kind
check(kind is PrimitiveKind) { "kind must be PrimitiveKind but found $kind" }
return object : KSerializer<R> {
override fun deserialize(decoder: Decoder): R =
this@mapPrimitive.deserialize(decoder).let(deserialize)
override val descriptor: SerialDescriptor = PrimitiveSerialDescriptor(serialName, kind)
override fun serialize(encoder: Encoder, value: R) =
this@mapPrimitive.serialize(encoder, value.let { serialize(it, it) })
}
}