/* * Copyright (C) 2022 Linnea Gräf * * This file is part of NotEnoughUpdates. * * NotEnoughUpdates is free software: you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, either * version 3 of the License, or (at your option) any later version. * * NotEnoughUpdates is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with NotEnoughUpdates. If not, see . */ package io.github.moulberry.notenoughupdates.util import com.google.gson.Gson import com.google.gson.JsonElement import java.lang.reflect.Field class Shimmy private constructor( val source: Any, val field: Field, ) { companion object { val gson = Gson() private fun shimmy(source: Any?, fieldName: String): Any? { if (source == null) return null return try { val declaredField = source.javaClass.getDeclaredField(fieldName) declaredField.isAccessible = true declaredField.get(source) } catch (e: NoSuchFieldException) { null } } @JvmStatic fun makeShimmy(source: Any?, path: List): Shimmy? { if (path.isEmpty()) return null var source = source for (part in path.dropLast(1)) { source = shimmy(source, part) } if (source == null) return null val lastName = path.last() return try { val field = source.javaClass.getDeclaredField(lastName) field.isAccessible = true Shimmy( source, field, ) } catch (e: NoSuchFieldException) { null } } } val clazz: Class<*> = field.type fun get(): Any? { return field.get(source) } fun set(value: Any?) { field.set(source, value) } fun getJson(): JsonElement { return gson.toJsonTree(get()) } fun setJson(element: JsonElement) { set(gson.fromJson(element, clazz)) } }