Skip to content

Commit

Permalink
refactor: convert EmojyTemplates to serialize as a Map instead of List
Browse files Browse the repository at this point in the history
  • Loading branch information
Boy0000 committed Aug 8, 2024
1 parent fecffa4 commit 0970cef
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 7 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ dependencies {
compileOnly(idofrontLibs.minecraft.mccoroutine)

// Shaded
paperweight.paperDevBundle("1.20.6-R0.1-SNAPSHOT") //NMS
paperweight.paperDevBundle("1.21-R0.1-SNAPSHOT") //NMS
implementation(project(path = ":core"))
implementation(project(path = ":v1_20_R4"))
implementation(project(path = ":v1_21_R1"))
Expand Down
2 changes: 1 addition & 1 deletion core/src/main/kotlin/com/mineinabyss/emojy/EmojyContext.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import com.mineinabyss.idofront.messaging.ComponentLogger

val emojy by DI.observe<EmojyContext>()
val emojyConfig by DI.observe<EmojyConfig>()
val templates get() = DI.observe<EmojyTemplates>().getOrNull()?.templates ?: emptySet()
val templates get() = DI.observe<EmojyTemplates>().getOrNull() ?: EmojyTemplates()
interface EmojyContext {
val plugin: EmojyPlugin
val emotes: Set<Emotes.Emote>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,14 @@ import kotlinx.serialization.EncodeDefault
import kotlinx.serialization.EncodeDefault.Mode.NEVER
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
import kotlinx.serialization.builtins.MapSerializer
import kotlinx.serialization.builtins.serializer
import net.kyori.adventure.key.Key

@Serializable
@Serializable(with = EmojyTemplates.Serializer::class)
data class EmojyTemplates(
val templates: Set<EmojyTemplate> = setOf(
val templates: List<EmojyTemplate> = listOf(
EmojyTemplate(
"example_template",
Key.key("example_namespace:example/texture.png"),
Expand All @@ -20,11 +23,30 @@ data class EmojyTemplates(
8
)
)
)
) {

@Transient private val ids = templates.map { it.id }

operator fun contains(template: @UnsafeVariance EmojyTemplate): Boolean = templates.contains(template)
operator fun contains(id: @UnsafeVariance String): Boolean = ids.contains(id)
fun forEach(action: (EmojyTemplate) -> Unit) = templates.forEach(action)
fun filter(filter: (EmojyTemplate) -> Boolean) = templates.filter(filter)
fun find(predicate: (EmojyTemplate) -> Boolean) = templates.find(predicate)
operator fun get(id: String) = templates.find { it.id == id }

class Serializer : InnerSerializer<Map<String, EmojyTemplate>, EmojyTemplates>(
"emojy:templates",
MapSerializer(String.serializer(), EmojyTemplate.serializer()),
{ EmojyTemplates(it.map { it.value.copy(id = it.key) }) },
{ it.templates.associateBy { it.id } }
)
}

@Serializable
data class EmojyTemplate(
val id: String,
// This is blank by default to avoid marking it as null
// The Serializer in PackyTemplates will always ensure the id is properly set
@Transient val id: String = "",
@EncodeDefault(NEVER) val texture: @Serializable(KeySerializer::class) Key? = null,
@EncodeDefault(NEVER) val font: @Serializable(KeySerializer::class) Key? = null,
@EncodeDefault(NEVER) val height: Int? = null,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.mineinabyss.emojy.config

import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

abstract class InnerSerializer<I, O>(
val serialName: String,
val inner: KSerializer<I>,
val transform: Decoder.(I) -> O,
val inverseTransform: (O) -> I,
) : KSerializer<O> {
override val descriptor =
if (inner.descriptor.kind is PrimitiveKind)
PrimitiveSerialDescriptor(serialName, inner.descriptor.kind as PrimitiveKind)
else SerialDescriptor(serialName, inner.descriptor)

override fun deserialize(decoder: Decoder): O {
return transform(decoder, inner.deserialize(decoder))
}

override fun serialize(encoder: Encoder, value: O) {
inner.serialize(encoder, inverseTransform(value))
}
}
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
group=com.mineinabyss
version=0.9
idofrontVersion=0.24.12
idofrontVersion=0.24.21

0 comments on commit 0970cef

Please sign in to comment.