diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/MaterialModifier.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/MaterialModifier.kt index 5fc5e9e2..62788996 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/MaterialModifier.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/MaterialModifier.kt @@ -33,7 +33,7 @@ data class MaterialModifier( .auto(MaterialModifier::grass) .list(MaterialModifier::miningSounds) .auto(MaterialModifier::miningParticle) - .plain(MaterialModifier::renderTemplate, RenderTemplate.CACHE) + .add(MaterialModifier::renderTemplate, RenderTemplate.CACHE) .auto(MaterialModifier::renderParameters) .build() diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/TileDefinition.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/TileDefinition.kt index 01afd827..b228508a 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/TileDefinition.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/defs/tile/TileDefinition.kt @@ -38,7 +38,7 @@ data class TileDefinition( TileDefinition::health, TileDefinition::category ) - .plain(TileDefinition::renderTemplate, RenderTemplate.CACHE) + .add(TileDefinition::renderTemplate, RenderTemplate.CACHE) .auto( TileDefinition::renderParameters, ) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt new file mode 100644 index 00000000..100158f6 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/Ext.kt @@ -0,0 +1,41 @@ +package ru.dbotthepony.kstarbound.io.json + +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonWriter + +fun TypeAdapter.transformRead(transformer: (T) -> T): TypeAdapter { + return object : TypeAdapter() { + override fun write(out: JsonWriter, value: T) { + return this@transformRead.write(out, value) + } + + override fun read(`in`: JsonReader): T { + return transformer(this@transformRead.read(`in`)) + } + } +} + +fun TypeAdapter.transformWrite(transformer: (T) -> T): TypeAdapter { + return object : TypeAdapter() { + override fun write(out: JsonWriter, value: T) { + return this@transformWrite.write(out, transformer(value)) + } + + override fun read(`in`: JsonReader): T { + return this@transformWrite.read(`in`) + } + } +} + +fun TypeAdapter.transform(transformRead: (T) -> T, transformWrite: (T) -> T): TypeAdapter { + return object : TypeAdapter() { + override fun write(out: JsonWriter, value: T) { + return this@transform.write(out, transformWrite(value)) + } + + override fun read(`in`: JsonReader): T { + return transformRead(this@transform.read(`in`)) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt index bf2e4037..80c54348 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/KConcreteTypeAdapter.kt @@ -377,7 +377,7 @@ class KConcreteTypeAdapter private constructor( /** * Добавляет поле с определённым адаптером */ - fun plain(field: KProperty1, adapter: TypeAdapter): Builder { + fun add(field: KProperty1, adapter: TypeAdapter): Builder { types.add(PackedProperty(field, adapter)) return this } @@ -410,7 +410,7 @@ class KConcreteTypeAdapter private constructor( * Список неизменяем (создаётся объект [ImmutableList]) */ fun list(field: KProperty1?>, type: Class, transformer: (List?) -> List? = { it }): Builder { - types.add(PackedProperty(field, ListAdapter(type), transformer = transformer)) + types.add(PackedProperty(field, ListAdapter(type).nullSafe(), transformer = transformer)) return this } @@ -420,7 +420,7 @@ class KConcreteTypeAdapter private constructor( * Список неизменяем (создаётся объект [ImmutableList]) */ inline fun list(field: KProperty1?>, noinline transformer: (List?) -> List? = { it }): Builder { - return this.list(field, V::class.java, transformer) + return add(field, ListAdapter(V::class.java).nullSafe()) } /** @@ -453,7 +453,7 @@ class KConcreteTypeAdapter private constructor( * Таблица неизменяема (создаётся объект [ImmutableMap]) */ fun map(field: KProperty1?>, keyType: KClass, valueType: KClass): Builder { - types.add(PackedProperty(field, MapAdapter(keyType.java, valueType.java))) + types.add(PackedProperty(field, MapAdapter(keyType.java, valueType.java).nullSafe())) return this } @@ -463,7 +463,7 @@ class KConcreteTypeAdapter private constructor( * Таблица неизменяема (создаётся объект [ImmutableMap]) */ fun map(field: KProperty1?>, valueType: Class): Builder { - types.add(PackedProperty(field, StringMapAdapter(valueType))) + types.add(PackedProperty(field, String2ObjectAdapter(valueType).nullSafe())) return this } @@ -473,7 +473,7 @@ class KConcreteTypeAdapter private constructor( * Таблица неизменяема (создаётся объект [ImmutableMap]) */ fun map(field: KProperty1?>, valueType: KClass): Builder { - types.add(PackedProperty(field, StringMapAdapter(valueType.java))) + types.add(PackedProperty(field, String2ObjectAdapter(valueType.java).nullSafe())) return this } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/ListAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/ListAdapter.kt index e8f2f19a..30fc3c13 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/ListAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/ListAdapter.kt @@ -8,18 +8,18 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter import ru.dbotthepony.kstarbound.Starbound -class ListAdapter(private val type: Class) : TypeAdapter?>() { - private val resolvedBound by lazy { Starbound.getTypeAdapter(type) } +fun TypeAdapter.asList(): TypeAdapter> { + return ListAdapter(this) +} - override fun write(out: JsonWriter, value: List?) { +class ListAdapter(val elementAdapter: TypeAdapter, val valueTransformer: (T) -> T = { it }) : TypeAdapter>() { + constructor(type: Class) : this(LazyTypeProvider(type)) + + override fun write(out: JsonWriter, value: List) { out.beginArray() - if (value != null) { - val resolvedBound = resolvedBound - - for (v in value) { - resolvedBound.write(out, v) - } + for (v in value) { + elementAdapter.write(out, v) } out.endArray() @@ -29,15 +29,14 @@ class ListAdapter(private val type: Class) : TypeAdapter?>() { reader.beginArray() val builder = ImmutableList.builder() - val resolvedBound = resolvedBound while (reader.peek() != JsonToken.END_ARRAY) { - val readObject = resolvedBound.read(reader) ?: throw JsonSyntaxException("List does not accept nulls") - builder.add(readObject as T) + val readObject = elementAdapter.read(reader) ?: throw JsonSyntaxException("List does not accept nulls") + builder.add(valueTransformer(readObject)) } reader.endArray() return builder.build() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/MapAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/MapAdapter.kt index cc17a15f..0e7ca6bd 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/MapAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/MapAdapter.kt @@ -7,23 +7,17 @@ import com.google.gson.stream.JsonToken import com.google.gson.stream.JsonWriter import ru.dbotthepony.kstarbound.Starbound -class MapAdapter(private val keyType: Class, private val valueType: Class) : TypeAdapter?>() { - private val resolvedKey by lazy { Starbound.getTypeAdapter(keyType) } - private val resolvedValue by lazy { Starbound.getTypeAdapter(valueType) } +class MapAdapter(val keyAdapter: TypeAdapter, val valueAdapter: TypeAdapter) : TypeAdapter>() { + constructor(keyType: Class, valueType: Class) : this(LazyTypeProvider(keyType), LazyTypeProvider(valueType)) - override fun write(out: JsonWriter, value: Map?) { + override fun write(out: JsonWriter, value: Map) { out.beginArray() - if (value != null) { - val resolvedKey = resolvedKey - val resolvedValue = resolvedValue - - for ((k, v) in value) { - out.beginArray() - resolvedKey.write(out, k) - resolvedValue.write(out, v) - out.endArray() - } + for ((k, v) in value) { + out.beginArray() + keyAdapter.write(out, k) + valueAdapter.write(out, v) + out.endArray() } out.endArray() @@ -34,12 +28,9 @@ class MapAdapter(private val keyType: Class, private val valueType: Cla val builder = ImmutableMap.builder() - val resolvedKey = resolvedKey - val resolvedValue = resolvedValue - while (reader.peek() != JsonToken.END_ARRAY) { reader.beginArray() - builder.put(resolvedKey.read(reader), resolvedValue.read(reader)) + builder.put(keyAdapter.read(reader), valueAdapter.read(reader)) reader.endArray() } @@ -47,4 +38,4 @@ class MapAdapter(private val keyType: Class, private val valueType: Cla return builder.build() } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/String2ObjectAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/String2ObjectAdapter.kt new file mode 100644 index 00000000..1a25b41b --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/String2ObjectAdapter.kt @@ -0,0 +1,41 @@ +package ru.dbotthepony.kstarbound.io.json + +import com.google.common.collect.ImmutableMap +import com.google.gson.TypeAdapter +import com.google.gson.stream.JsonReader +import com.google.gson.stream.JsonToken +import com.google.gson.stream.JsonWriter +import ru.dbotthepony.kstarbound.Starbound + +fun TypeAdapter.asJsonObject(): TypeAdapter> { + return String2ObjectAdapter(this) +} + +class String2ObjectAdapter(val adapter: TypeAdapter) : TypeAdapter>() { + constructor(type: Class) : this(LazyTypeProvider(type)) + + override fun write(out: JsonWriter, value: Map) { + out.beginObject() + + for ((k, v) in value) { + out.name(k) + adapter.write(out, v) + } + + out.endObject() + } + + override fun read(reader: JsonReader): Map { + val builder = ImmutableMap.builder() + + reader.beginObject() + + while (reader.peek() != JsonToken.END_OBJECT) { + builder.put(Starbound.assetStringInterner.intern(reader.nextName()), adapter.read(reader)) + } + + reader.endObject() + + return builder.build() + } +} diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/StringMapAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/StringMapAdapter.kt deleted file mode 100644 index f9d34361..00000000 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/json/StringMapAdapter.kt +++ /dev/null @@ -1,43 +0,0 @@ -package ru.dbotthepony.kstarbound.io.json - -import com.google.common.collect.ImmutableMap -import com.google.gson.TypeAdapter -import com.google.gson.stream.JsonReader -import com.google.gson.stream.JsonToken -import com.google.gson.stream.JsonWriter -import ru.dbotthepony.kstarbound.Starbound - -class StringMapAdapter(private val type: Class) : TypeAdapter?>() { - private val resolvedBound by lazy { Starbound.getTypeAdapter(type) } - - override fun write(out: JsonWriter, value: Map?) { - val resolvedBound = resolvedBound - - out.beginObject() - - if (value != null) { - for ((k, v) in value) { - out.name(k) - resolvedBound.write(out, v) - } - } - - out.endObject() - } - - override fun read(reader: JsonReader): Map { - val builder = ImmutableMap.builder() - - reader.beginObject() - - val resolvedBound = resolvedBound - - while (reader.peek() != JsonToken.END_OBJECT) { - builder.put(Starbound.assetStringInterner.intern(reader.nextName()), resolvedBound.read(reader)) - } - - reader.endObject() - - return builder.build() - } -} \ No newline at end of file