aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/commands/dsl.kt
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-10-13 18:59:48 +0200
committerLinnea Gräf <nea@nea.moe>2025-10-13 18:59:48 +0200
commitf73a0e4e8e7c4306cdaf0ed163d312c6a0b2c1d5 (patch)
treece0f1b13e8cc852a76d834a9d1d221dcf8a4f591 /src/main/kotlin/commands/dsl.kt
parent584955e8f857f1f919bc1485d811ee5d6dbd688c (diff)
downloadFirmament-f73a0e4e8e7c4306cdaf0ed163d312c6a0b2c1d5.tar.gz
Firmament-f73a0e4e8e7c4306cdaf0ed163d312c6a0b2c1d5.tar.bz2
Firmament-f73a0e4e8e7c4306cdaf0ed163d312c6a0b2c1d5.zip
fix: /warp autocompletion breaking all warps
Diffstat (limited to 'src/main/kotlin/commands/dsl.kt')
-rw-r--r--src/main/kotlin/commands/dsl.kt132
1 files changed, 64 insertions, 68 deletions
diff --git a/src/main/kotlin/commands/dsl.kt b/src/main/kotlin/commands/dsl.kt
index c5955d7..4f76c69 100644
--- a/src/main/kotlin/commands/dsl.kt
+++ b/src/main/kotlin/commands/dsl.kt
@@ -1,5 +1,3 @@
-
-
package moe.nea.firmament.commands
import com.mojang.brigadier.arguments.ArgumentType
@@ -22,97 +20,95 @@ typealias DefaultSource = FabricClientCommandSource
inline val <T : CommandContext<*>> T.context get() = this
operator fun <T : Any, C : CommandContext<*>> C.get(arg: TypeSafeArg<T>): T {
- return arg.get(this)
+ return arg.get(this)
}
fun literal(
- name: String,
- block: CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>.() -> Unit
+ name: String,
+ block: CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>.() -> Unit
): CaseInsensitiveLiteralCommandNode.Builder<DefaultSource> =
- CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>(name).also(block)
+ CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>(name).also(block)
private fun normalizeGeneric(argument: Type): Class<*> {
- return when (argument) {
- is Class<*> -> argument
- is TypeVariable<*> -> normalizeGeneric(argument.bounds[0])
- is ParameterizedType -> normalizeGeneric(argument.rawType)
- else -> Any::class.java
- }
+ return when (argument) {
+ is Class<*> -> argument
+ is TypeVariable<*> -> normalizeGeneric(argument.bounds[0])
+ is ParameterizedType -> normalizeGeneric(argument.rawType)
+ else -> Any::class.java
+ }
}
data class TypeSafeArg<T : Any>(val name: String, val argument: ArgumentType<T>) {
- val argClass by lazy {
- argument.javaClass
- .iterate<Class<in ArgumentType<T>>> {
- it.superclass
- }
- .flatMap {
- it.genericInterfaces.toList()
- }
- .filterIsInstance<ParameterizedType>()
- .find { it.rawType == ArgumentType::class.java }!!
- .let { normalizeGeneric(it.actualTypeArguments[0]) }
- }
-
- @JvmName("getWithThis")
- fun <S> CommandContext<S>.get(): T =
- get(this)
-
-
- fun <S> get(ctx: CommandContext<S>): T {
- try {
- return ctx.getArgument(name, argClass) as T
- } catch (e: Exception) {
- if (ctx.child != null) {
- return get(ctx.child)
- }
- throw e
- }
- }
+ val argClass by lazy {
+ argument.javaClass
+ .iterate<Class<in ArgumentType<T>>> {
+ it.superclass
+ }
+ .flatMap {
+ it.genericInterfaces.toList()
+ }
+ .filterIsInstance<ParameterizedType>()
+ .find { it.rawType == ArgumentType::class.java }!!
+ .let { normalizeGeneric(it.actualTypeArguments[0]) }
+ }
+
+ @JvmName("getWithThis")
+ fun <S> CommandContext<S>.get(): T =
+ get(this)
+
+
+ fun <S> get(ctx: CommandContext<S>): T {
+ try {
+ return ctx.getArgument(name, argClass) as T
+ } catch (e: Exception) {
+ if (ctx.child != null) {
+ return get(ctx.child)
+ }
+ throw e
+ }
+ }
}
fun <T : Any> argument(
- name: String,
- argument: ArgumentType<T>,
- block: RequiredArgumentBuilder<DefaultSource, T>.(TypeSafeArg<T>) -> Unit
+ name: String,
+ argument: ArgumentType<T>,
+ block: RequiredArgumentBuilder<DefaultSource, T>.(TypeSafeArg<T>) -> Unit
): RequiredArgumentBuilder<DefaultSource, T> =
- RequiredArgumentBuilder.argument<DefaultSource, T>(name, argument).also { block(it, TypeSafeArg(name, argument)) }
+ RequiredArgumentBuilder.argument<DefaultSource, T>(name, argument).also { block(it, TypeSafeArg(name, argument)) }
fun <T : ArgumentBuilder<DefaultSource, T>, AT : Any> T.thenArgument(
- name: String,
- argument: ArgumentType<AT>,
- block: RequiredArgumentBuilder<DefaultSource, AT>.(TypeSafeArg<AT>) -> Unit
+ name: String,
+ argument: ArgumentType<AT>,
+ block: RequiredArgumentBuilder<DefaultSource, AT>.(TypeSafeArg<AT>) -> Unit
): T = then(argument(name, argument, block))
fun <T : RequiredArgumentBuilder<DefaultSource, String>> T.suggestsList(provider: CommandContext<DefaultSource>.() -> Iterable<String>) {
- suggests(SuggestionProvider<DefaultSource> { context, builder ->
- provider(context)
- .asSequence()
- .filter { it.startsWith(builder.remaining, ignoreCase = true) }
- .forEach {
- builder.suggest(it)
- }
- builder.buildFuture()
- })
+ suggests(SuggestionProvider<DefaultSource> { context, builder ->
+ provider(context)
+ .asSequence()
+ .filter { it.startsWith(builder.remaining, ignoreCase = true) }
+ .forEach {
+ builder.suggest(it)
+ }
+ builder.buildFuture()
+ })
}
fun <T : ArgumentBuilder<DefaultSource, T>> T.thenLiteral(
- name: String,
- block: CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>.() -> Unit
+ name: String,
+ block: CaseInsensitiveLiteralCommandNode.Builder<DefaultSource>.() -> Unit
): T =
- then(literal(name, block))
+ then(literal(name, block))
fun <T : ArgumentBuilder<DefaultSource, T>> T.then(node: ArgumentBuilder<DefaultSource, *>, block: T.() -> Unit): T =
- then(node).also(block)
-
-fun <T : ArgumentBuilder<DefaultSource, T>> T.thenExecute(block: suspend CommandContext<DefaultSource>.() -> Unit): T =
- executes {
- Firmament.coroutineScope.launch(MinecraftDispatcher) {
- block(it)
- }
- 1
- }
+ then(node).also(block)
+
+fun <T : ArgumentBuilder<DefaultSource, T>> T.thenExecute(block: CommandContext<DefaultSource>.() -> Unit): T =
+ executes {
+ block(it)
+ 1
+ }