blob: 99ed4b2314cdf5cc126b18b243d85e7048583e7c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package at.hannibal2.skyhanni.utils
import at.hannibal2.skyhanni.config.HasLegacyId
import com.google.gson.JsonArray
import com.google.gson.JsonElement
import com.google.gson.JsonPrimitive
object ConfigUtils {
/**
* Migrates an Int ArrayList to an Enum ArrayList.
* The new enum class should implement HasLegacyId and have a getter for LegacyId
*
* @param element The JsonElement to migrate
* @param enumClass The enum class to migrate to
* @return The migrated JsonElement
*/
fun <T> migrateIntArrayListToEnumArrayList(element: JsonElement, enumClass: Class<T>): JsonElement
where T : Enum<T>, T : HasLegacyId {
require(element is JsonArray) { "Expected a JsonArray but got ${element.javaClass.simpleName}" }
// An array of enum constants that are to be migrated
val migratedArray = element.mapNotNull { jsonElement ->
val index = jsonElement.asInt
getEnumConstantFromLegacyId(index, enumClass)?.name
}.map { JsonPrimitive(it) }
// Return a JsonArray of the migrated enum constants
return JsonArray().apply {
migratedArray.forEach { add(it) }
}
}
/**
* Gets an enum constant from a legacy id
* @param legacyId The legacy id to get the enum constant from
* @param enumClass The enum class to get the enum constant from
* @return The enum constant, or null if not found
*/
private fun <T> getEnumConstantFromLegacyId(
legacyId: Int,
enumClass: Class<T>
): T? where T : Enum<T>, T : HasLegacyId {
for (enumConstant in enumClass.getEnumConstants()) {
if (enumConstant.legacyId == legacyId) return enumConstant
}
return null
}
/**
* Migrates an Int to an Enum Constant.
* The new enum class should implement HasLegacyId and have a getter for LegacyId
*
* @param element The JsonElement to migrate
* @param enumClass The enum class to migrate to
* @return The migrated JsonElement
*/
fun <T> migrateIntToEnum(element: JsonElement, enumClass: Class<T>): JsonElement
where T : Enum<T>, T : HasLegacyId {
require(element is JsonPrimitive) { "Expected a JsonPrimitive but got ${element.javaClass.simpleName}" }
return JsonPrimitive(getEnumConstantFromLegacyId(element.asInt, enumClass)?.name)
}
}
|