diff options
| author | Linnea Gräf <nea@nea.moe> | 2025-10-13 18:59:48 +0200 |
|---|---|---|
| committer | Linnea Gräf <nea@nea.moe> | 2025-10-13 18:59:48 +0200 |
| commit | f73a0e4e8e7c4306cdaf0ed163d312c6a0b2c1d5 (patch) | |
| tree | ce0f1b13e8cc852a76d834a9d1d221dcf8a4f591 /src/main/kotlin/commands/dsl.kt | |
| parent | 584955e8f857f1f919bc1485d811ee5d6dbd688c (diff) | |
| download | Firmament-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.kt | 132 |
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 + } |
