Трансформеры значений у KConcreteTypeAdapter
This commit is contained in:
parent
b8dc265037
commit
1fe0b25efa
@ -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) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user