diff options
author | nea <romangraef@gmail.com> | 2022-08-27 02:37:34 +0200 |
---|---|---|
committer | nea <romangraef@gmail.com> | 2022-08-27 02:37:34 +0200 |
commit | 2019473c50dfe3f1c6fd071d123d49d43bc180c4 (patch) | |
tree | 56ae9b81672582bfab2993f6b4a110c8a98e6682 /src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt | |
parent | 973c13e84f8e091a6a920779103d96559dcd32a8 (diff) | |
download | firmament-2019473c50dfe3f1c6fd071d123d49d43bc180c4.tar.gz firmament-2019473c50dfe3f1c6fd071d123d49d43bc180c4.tar.bz2 firmament-2019473c50dfe3f1c6fd071d123d49d43bc180c4.zip |
move commands to its own place
Diffstat (limited to 'src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt')
-rw-r--r-- | src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt b/src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt new file mode 100644 index 0000000..c21eab8 --- /dev/null +++ b/src/main/kotlin/moe/nea/notenoughupdates/commands/dsl.kt @@ -0,0 +1,75 @@ +package moe.nea.notenoughupdates.commands + +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.builder.ArgumentBuilder +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder +import com.mojang.brigadier.context.CommandContext +import moe.nea.notenoughupdates.util.iterate +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import java.lang.reflect.ParameterizedType + + +typealias DefaultSource = FabricClientCommandSource + +fun literal( + name: String, + block: LiteralArgumentBuilder<DefaultSource>.() -> Unit +): LiteralArgumentBuilder<DefaultSource> = + LiteralArgumentBuilder.literal<DefaultSource>(name).also(block) + +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 + } + .map { + it.genericSuperclass + } + .filterIsInstance<ParameterizedType>() + .find { it.rawType == ArgumentType::class.java }!! + .let { it.actualTypeArguments[0] as Class<*> } + } + + @JvmName("getWithThis") + fun <S> CommandContext<S>.get(): T = + get(this) + + + fun <S> get(ctx: CommandContext<S>): T { + return ctx.getArgument(name, argClass) as T + } +} + + +fun <T : Any> argument( + 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)) } + +fun <T : ArgumentBuilder<DefaultSource, T>, AT : Any> T.thenArgument( + name: String, + argument: ArgumentType<AT>, + block: RequiredArgumentBuilder<DefaultSource, AT>.(TypeSafeArg<AT>) -> Unit +): T = then(argument(name, argument, block)) + + +fun <T : ArgumentBuilder<DefaultSource, T>> T.thenLiteral( + name: String, + block: LiteralArgumentBuilder<DefaultSource>.() -> Unit +): T = + 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: CommandContext<DefaultSource>.() -> Unit): T = + executes { + block(it) + 1 + } + + |