From fd05d40806ffa88f492b4ec1e5d20036ab8faeb2 Mon Sep 17 00:00:00 2001 From: grimsi <9295182+grimsi@users.noreply.github.com> Date: Tue, 10 Jun 2025 12:33:49 +0200 Subject: [PATCH] Improve plugin config value parsing --- .../wrapper/ConfigurableGameyfinPlugin.kt | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt index f7e5632..9a565b2 100644 --- a/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt +++ b/plugin-api/src/main/kotlin/de/grimsi/gameyfin/pluginapi/core/wrapper/ConfigurableGameyfinPlugin.kt @@ -57,17 +57,44 @@ abstract class ConfigurableGameyfinPlugin(wrapper: PluginWrapper) : GameyfinPlug private fun castConfigValue(meta: ConfigMetadata<*>, value: Any): Any? { val expectedType = meta.type - return if (expectedType.isEnum) { + + // Handle enums + if (expectedType.isEnum) { try { - java.lang.Enum.valueOf(expectedType as Class>, value.toString()) + return java.lang.Enum.valueOf(expectedType as Class>, value.toString()) } catch (_: IllegalArgumentException) { throw PluginConfigError("Invalid value '${value}', must be one of ${meta.allowedValues!!.joinToString(", ")}") } - } else { - if (!expectedType.isInstance(value)) { - throw PluginConfigError("Value for key '${meta.key}' is not of type ${expectedType.simpleName}") + } + + // If already correct type + if (expectedType.isInstance(value)) return value + + // Try to convert common types + try { + return when (expectedType) { + Int::class.java, Integer::class.java -> value.toString().toInt() + Float::class.java, java.lang.Float::class.java -> value.toString().toFloat() + Double::class.java, java.lang.Double::class.java -> value.toString().toDouble() + Long::class.java, java.lang.Long::class.java -> value.toString().toLong() + Boolean::class.java, java.lang.Boolean::class.java -> value.toString().toBooleanStrict() + String::class.java -> value.toString() + else -> { + // Try valueOf(String) or parse(String) via reflection + val method = expectedType.methods.find { + (it.name == "valueOf" || it.name == "parse") && + it.parameterTypes.size == 1 && + it.parameterTypes[0] == String::class.java + } + if (method != null) { + method.invoke(null, value.toString()) + } else { + throw IllegalArgumentException() + } + } } - value + } catch (_: Exception) { + throw PluginConfigError("Value must be of type ${expectedType.simpleName}") } }