package ru.dbotthepony.kstarbound.defs.util import com.github.benmanes.caffeine.cache.Interner import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonNull import com.google.gson.JsonObject import com.google.gson.JsonPrimitive import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap private fun flattenJsonPrimitive(input: JsonPrimitive, interner: Interner = Interner { it }): Any { if (input.isNumber) { return input.asNumber } else if (input.isString) { return interner.intern(input.asString) } else { return input.asBoolean } } private fun flattenJsonArray(input: JsonArray, interner: Interner = Interner { it }): ArrayList { val flattened = ArrayList(input.size()) for (v in input) { when (v) { is JsonObject -> flattened.add(flattenJsonObject(v, interner)) is JsonArray -> flattened.add(flattenJsonArray(v, interner)) is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v, interner)) // is JsonNull -> baked.add(null) } } return flattened } private fun flattenJsonObject(input: JsonObject, interner: Interner = Interner { it }): MutableMap { val flattened = HashMap() for ((k, v) in input.entrySet()) { when (v) { is JsonObject -> flattened[k] = flattenJsonObject(v, interner) is JsonArray -> flattened[k] = flattenJsonArray(v, interner) is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v, interner) } } return flattened } fun flattenJsonElement(input: JsonElement, interner: Interner = Interner { it }): Any? { return when (input) { is JsonObject -> flattenJsonObject(input, interner) is JsonArray -> flattenJsonArray(input, interner) is JsonPrimitive -> flattenJsonPrimitive(input, interner) is JsonNull -> null else -> throw IllegalArgumentException("Unknown argument $input") } } fun flattenJsonElement(input: JsonObject, interner: Interner = Interner { it }) = flattenJsonObject(input, interner) fun flattenJsonElement(input: JsonArray, interner: Interner = Interner { it }) = flattenJsonArray(input, interner) fun flattenJsonElement(input: JsonPrimitive, interner: Interner = Interner { it }) = flattenJsonPrimitive(input, interner)