package ru.dbotthepony.kstarbound import com.google.gson.JsonElement import com.google.gson.TypeAdapter import com.google.gson.stream.JsonReader import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap import ru.dbotthepony.kstarbound.json.VersionedJson object VersionRegistry { private val versions = Object2IntOpenHashMap() fun currentVersion(name: String): Int { return versions.getInt(name) } fun make(name: String, contents: JsonElement): VersionedJson { return VersionedJson(name, currentVersion(name), contents) } fun load(name: String, reader: JsonReader, adapter: TypeAdapter): T { val read = this.adapter.read(reader) ?: throw NullPointerException("Expected versioned json $name, but found null") if (read.version != currentVersion(name)) { throw IllegalStateException("NYI: Migrating $name from ${read.version} to ${currentVersion(name)}") } return adapter.fromJsonTree(read.content) } private val adapter by lazy { Starbound.gson.getAdapter(VersionedJson::class.java) } }