Трансформеры значений у KConcreteTypeAdapter

This commit is contained in:
DBotThePony 2022-12-30 11:20:03 +07:00
parent b8dc265037
commit 1fe0b25efa
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 54 additions and 27 deletions

View File

@ -48,6 +48,21 @@ object Starbound {
* Служит переменной для указания из какой папки происходит чтение asset'а в данном потоке * Служит переменной для указания из какой папки происходит чтение asset'а в данном потоке
*/ */
var readingFolder by ThreadLocal<String>() var readingFolder by ThreadLocal<String>()
private set
fun readingFolderTransformer(input: String): String {
if (input[0] == '/')
return input
return "$readingFolder/$input"
}
fun readingFolderTransformerNullable(input: String?): String? {
if (input != null)
return readingFolderTransformer(input)
return null
}
private val tiles = HashMap<String, TileDefinition>() private val tiles = HashMap<String, TileDefinition>()
private val tilesByMaterialID = Int2ObjectAVLTreeMap<TileDefinition>() private val tilesByMaterialID = Int2ObjectAVLTreeMap<TileDefinition>()
@ -432,5 +447,7 @@ object Starbound {
} }
} }
} }
items.values.forEach { println(it) }
} }
} }

View File

@ -1,10 +1,10 @@
package ru.dbotthepony.kstarbound.defs.item package ru.dbotthepony.kstarbound.defs.item
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.io.KConcreteTypeAdapter import ru.dbotthepony.kstarbound.io.KConcreteTypeAdapter
import ru.dbotthepony.kstarbound.registerTypeAdapter import ru.dbotthepony.kstarbound.registerTypeAdapter
import ru.dbotthepony.kvector.vector.ndouble.Vector2d import ru.dbotthepony.kvector.vector.ndouble.Vector2d
import ru.dbotthepony.kvector.vector.nint.Vector2i
data class ItemDefinition( data class ItemDefinition(
/** /**
@ -136,7 +136,7 @@ data class ItemDefinition(
.plain(ItemDefinition::price) .plain(ItemDefinition::price)
.plain(ItemDefinition::rarity) .plain(ItemDefinition::rarity)
.plain(ItemDefinition::category) .plain(ItemDefinition::category)
.plain(ItemDefinition::inventoryIcon) .plain(ItemDefinition::inventoryIcon, Starbound::readingFolderTransformerNullable)
.plain(ItemDefinition::description) .plain(ItemDefinition::description)
.plain(ItemDefinition::shortdescription) .plain(ItemDefinition::shortdescription)
@ -149,7 +149,7 @@ data class ItemDefinition(
.list(ItemDefinition::pickupQuestTemplates) .list(ItemDefinition::pickupQuestTemplates)
.plain(ItemDefinition::race) .plain(ItemDefinition::race)
.plain(ItemDefinition::displayImage) .plain(ItemDefinition::displayImage, Starbound::readingFolderTransformerNullable)
.plain(ItemDefinition::displayoffset) .plain(ItemDefinition::displayoffset)
.plain(ItemDefinition::fossilSetName) .plain(ItemDefinition::fossilSetName)
.plain(ItemDefinition::setIndex) .plain(ItemDefinition::setIndex)

View File

@ -11,7 +11,6 @@ import com.google.gson.stream.JsonReader
import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonToken
import com.google.gson.stream.JsonWriter import com.google.gson.stream.JsonWriter
import it.unimi.dsi.fastutil.objects.Object2IntArrayMap import it.unimi.dsi.fastutil.objects.Object2IntArrayMap
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.ObjectArraySet import it.unimi.dsi.fastutil.objects.ObjectArraySet
import org.apache.logging.log4j.LogManager import org.apache.logging.log4j.LogManager
import ru.dbotthepony.kstarbound.Starbound import ru.dbotthepony.kstarbound.Starbound
@ -302,10 +301,11 @@ class KConcreteTypeAdapter<T : Any> private constructor(
continue continue
} }
val (field, adapter) = iterator.next() val tuple = iterator.next()
val (field, adapter) = tuple
try { try {
readValues[fieldId] = adapter.read(reader) readValues[fieldId] = (tuple.transformer as (Any?) -> Any?)(adapter.read(reader))
presentValues[fieldId] = true presentValues[fieldId] = true
} catch(err: Throwable) { } catch(err: Throwable) {
throw JsonSyntaxException("Exception reading field ${field.name} for ${bound.qualifiedName}", err) throw JsonSyntaxException("Exception reading field ${field.name} for ${bound.qualifiedName}", err)
@ -330,10 +330,11 @@ class KConcreteTypeAdapter<T : Any> private constructor(
reader.skipValue() reader.skipValue()
} else { } else {
val (field, adapter) = types[fieldId] val tuple = types[fieldId]
val (field, adapter) = tuple
try { try {
readValues[fieldId] = adapter.read(reader) readValues[fieldId] = (tuple.transformer as (Any?) -> Any?)(adapter.read(reader))
presentValues[fieldId] = true presentValues[fieldId] = true
} catch(err: Throwable) { } catch(err: Throwable) {
if (currentSymbolicName == null) { if (currentSymbolicName == null) {
@ -462,29 +463,38 @@ class KConcreteTypeAdapter<T : Any> private constructor(
} }
/** /**
* Добавляет поле(я) без generic типов и без преобразователей * Добавляет поля без generic типов и без преобразователей
*/ */
@Suppress("unchecked_cast") @Suppress("unchecked_cast")
fun plain(vararg fields: KProperty1<T, *>): Builder<T> { fun plain(vararg fields: KProperty1<T, *>): Builder<T> {
for (field in fields) { for (field in fields)
val returnType = field.returnType plain(field)
val classifier = returnType.classifier as? KClass<*> ?: throw ClassCastException("Unable to cast ${returnType.classifier} to KClass of property ${field.name}!")
if (classifier.isSuperclassOf(Float::class)) { return this
types.add(PackedProperty(field as KProperty1<T, Float>, TypeAdapters.FLOAT)) }
} else if (classifier.isSuperclassOf(Double::class)) {
types.add(PackedProperty(field as KProperty1<T, Double>, TypeAdapters.DOUBLE)) /**
} else if (classifier.isSuperclassOf(Int::class)) { * Добавляет поле без generic типов, опционально с преобразователем
types.add(PackedProperty(field as KProperty1<T, Int>, TypeAdapters.INTEGER)) */
} else if (classifier.isSuperclassOf(Long::class)) { @Suppress("unchecked_cast")
types.add(PackedProperty(field as KProperty1<T, Long>, TypeAdapters.LONG)) fun <In> plain(field: KProperty1<T, In>, transformer: (In) -> In = { it }): Builder<T> {
} else if (classifier.isSuperclassOf(String::class)) { val returnType = field.returnType
types.add(PackedProperty(field as KProperty1<T, String>, internedStringAdapter)) val classifier = returnType.classifier as? KClass<*> ?: throw ClassCastException("Unable to cast ${returnType.classifier} to KClass of property ${field.name}!")
} else if (classifier.isSuperclassOf(Boolean::class)) {
types.add(PackedProperty(field as KProperty1<T, Boolean>, TypeAdapters.BOOLEAN)) if (classifier.isSuperclassOf(Float::class)) {
} else { types.add(PackedProperty(field as KProperty1<T, Float>, TypeAdapters.FLOAT, transformer = transformer as (Number) -> Number))
types.add(PackedProperty(field, LazyTypeProvider(classifier.java) as TypeAdapter<Any?>)) } else if (classifier.isSuperclassOf(Double::class)) {
} types.add(PackedProperty(field as KProperty1<T, Double>, TypeAdapters.DOUBLE, transformer = transformer as (Number) -> Number))
} else if (classifier.isSuperclassOf(Int::class)) {
types.add(PackedProperty(field as KProperty1<T, Int>, TypeAdapters.INTEGER, transformer = transformer as (Number) -> Number))
} else if (classifier.isSuperclassOf(Long::class)) {
types.add(PackedProperty(field as KProperty1<T, Long>, TypeAdapters.LONG, transformer = transformer as (Number) -> Number))
} else if (classifier.isSuperclassOf(String::class)) {
types.add(PackedProperty(field as KProperty1<T, String>, internedStringAdapter, transformer = transformer as (String) -> String))
} else if (classifier.isSuperclassOf(Boolean::class)) {
types.add(PackedProperty(field as KProperty1<T, Boolean>, TypeAdapters.BOOLEAN, transformer = transformer as (Boolean) -> Boolean))
} else {
types.add(PackedProperty(field, LazyTypeProvider(classifier.java) as TypeAdapter<Any?>, transformer = transformer as (Any?) -> Any?))
} }
return this return this