From 88378b2890a9ce9cd48724cde9979f8884b080fc Mon Sep 17 00:00:00 2001 From: Gareth Coles Date: Mon, 3 Jun 2024 10:49:09 +0100 Subject: [PATCH] Provide more detail when user accesses parsed converter value before it's filled. Fixes #300 --- .../commands/converters/Converter.kt | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/kord-extensions/src/main/kotlin/com/kotlindiscord/kord/extensions/commands/converters/Converter.kt b/kord-extensions/src/main/kotlin/com/kotlindiscord/kord/extensions/commands/converters/Converter.kt index 646418a5cd..25967cdce0 100644 --- a/kord-extensions/src/main/kotlin/com/kotlindiscord/kord/extensions/commands/converters/Converter.kt +++ b/kord-extensions/src/main/kotlin/com/kotlindiscord/kord/extensions/commands/converters/Converter.kt @@ -87,12 +87,28 @@ public abstract class Converter /** For delegation, retrieve the parsed value if it's been set, or null if it hasn't. **/ - public operator fun getValue(thisRef: Arguments, property: KProperty<*>): OutputType = - if (::genericBuilder.isInitialized && genericBuilder.mutator != null) { - genericBuilder.mutator!!(parsed) - } else { - parsed + public operator fun getValue(thisRef: Arguments, property: KProperty<*>): OutputType { + try { + return if (::genericBuilder.isInitialized && genericBuilder.mutator != null) { + genericBuilder.mutator!!(parsed) + } else { + parsed + } + } catch (e: UninitializedPropertyAccessException) { + throw UninitializedPropertyAccessException( + "Parsed value accessed before it has been filled." + + "\n\n" + + "This may happen when arguments are accessed from other argument builders out of order, users " + + "provide arguments in the wrong order, or previous arguments are accessed in autoComplete " + + "builders and `parseForAutocomplete` is not overridden to be `true` in your `Arguments` subclass." + + "\n\n" + + "If you believe this exception was thrown due to a bug, please raise an issue on the Kord " + + "Extensions GitHub, or ask about it on the Kord Extensions Discord server.", + + e + ) } + } /** * Given a Throwable encountered during the [parse] function, return a human-readable string to display on Discord.