Skip to content

Commit e16f45d

Browse files
authored
Fix custom suggestions not being triggered when transformed (#24)
1 parent 4ea659e commit e16f45d

File tree

3 files changed

+18
-2
lines changed

3 files changed

+18
-2
lines changed

brigadier/src/jvmMain/kotlin/org/anvilpowered/kbrig/brigadier/BrigadierConverter.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import org.anvilpowered.kbrig.context.CommandContext
2323
import org.anvilpowered.kbrig.context.StringRange
2424
import org.anvilpowered.kbrig.coroutine.coroutineToFuture
2525
import org.anvilpowered.kbrig.suggestion.Suggestion
26+
import org.anvilpowered.kbrig.suggestion.SuggestionProvider
2627
import org.anvilpowered.kbrig.suggestion.Suggestions
2728
import org.anvilpowered.kbrig.suggestion.SuggestionsBuilder
2829
import org.anvilpowered.kbrig.tree.ArgumentCommandNode
@@ -42,6 +43,7 @@ import com.mojang.brigadier.arguments.StringArgumentType as BrigadierStringArgum
4243
import com.mojang.brigadier.context.CommandContext as BrigadierCommandContext
4344
import com.mojang.brigadier.context.StringRange as BrigadierStringRange
4445
import com.mojang.brigadier.suggestion.Suggestion as BrigadierSuggestion
46+
import com.mojang.brigadier.suggestion.SuggestionProvider as BrigadierSuggestionProvider
4547
import com.mojang.brigadier.suggestion.Suggestions as BrigadierSuggestions
4648
import com.mojang.brigadier.suggestion.SuggestionsBuilder as BrigadierSuggestionsBuilder
4749
import com.mojang.brigadier.tree.ArgumentCommandNode as BrigadierArgumentCommandNode
@@ -71,7 +73,7 @@ fun <S, T> ArgumentCommandNode<S, T>.toBrigadier(): BrigadierArgumentCommandNode
7173
redirect?.toBrigadier(),
7274
null,
7375
forks,
74-
null,
76+
customSuggestions?.toBrigadier(),
7577
).withChildrenFrom(this)
7678
}
7779

@@ -140,6 +142,15 @@ private fun <T> ArgumentType<T>.toDefaultBrigadierArgument(): BrigadierArgumentT
140142
}
141143
}
142144

145+
private fun <S> SuggestionProvider<S>.toBrigadier(): BrigadierSuggestionProvider<S> {
146+
val original = this
147+
return BrigadierSuggestionProvider { context, builder ->
148+
coroutineToFuture {
149+
original.getSuggestions(context.toKBrig(), builder.toKBrig()).toBrigadier()
150+
}
151+
}
152+
}
153+
143154
private fun Suggestions.toBrigadier(): BrigadierSuggestions = BrigadierSuggestions(range.toBrigadier(), list.map { it.toBrigadier() })
144155
private fun Suggestion.toBrigadier(): BrigadierSuggestion = BrigadierSuggestion(range.toBrigadier(), text)
145156
private fun StringRange.toBrigadier(): BrigadierStringRange = BrigadierStringRange(start, end)

core/src/commonMain/kotlin/org/anvilpowered/kbrig/tree/ArgumentCommandNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class ArgumentCommandNode<S, T>(
2323
redirect: CommandNode<S>? = null,
2424
forks: Boolean = false,
2525
children: Map<String, CommandNode<S>>,
26-
private val customSuggestions: SuggestionProvider<S>? = null,
26+
val customSuggestions: SuggestionProvider<S>? = null,
2727
) : CommandNode<S>(name, command, requirement, redirect, forks, children) {
2828

2929
override val usageText: String

core/src/commonMain/kotlin/org/anvilpowered/kbrig/tree/SourceConverter.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package org.anvilpowered.kbrig.tree
1111

1212
import org.anvilpowered.kbrig.Command
1313
import org.anvilpowered.kbrig.context.CommandContext
14+
import org.anvilpowered.kbrig.suggestion.SuggestionProvider
1415
import kotlin.jvm.JvmName
1516

1617
/**
@@ -25,6 +26,7 @@ fun <S, R, T> ArgumentCommandNode<S, T>.mapSource(mapper: (R) -> S): ArgumentCom
2526
redirect?.mapSource(mapper),
2627
forks,
2728
children.mapValues { (_, child) -> child.mapSource(mapper) },
29+
customSuggestions?.mapSource(mapper),
2830
)
2931

3032
/**
@@ -72,6 +74,9 @@ private fun <S, R> Command<S>.mapSource(mapper: (R) -> S): Command<R> =
7274
*/
7375
private fun <S, R> ((S) -> Boolean).mapSource(mapper: (R) -> S): (R) -> Boolean = { this(mapper(it)) }
7476

77+
private fun <S, R> SuggestionProvider<S>.mapSource(mapper: (R) -> S): SuggestionProvider<R> =
78+
SuggestionProvider { context, builder -> getSuggestions(context.mapToOriginalSource(mapper), builder) }
79+
7580
/**
7681
* Converts the given [CommandContext] with source type [R] to an [CommandContext] with source type [S].
7782
*/

0 commit comments

Comments
 (0)