From f92dfbf2e0246485846ea09b5ece03cdc3082d90 Mon Sep 17 00:00:00 2001 From: Taskeren Date: Sun, 1 Oct 2023 11:55:15 +0800 Subject: [PATCH] Support Context Receivers for advanced usage Now supports things like this: ``` dispatcher { "literal_arg_1" { executesX { // ... do something } "typed_arg_1"(StringArgumentType.greedyString()) { executesX { val theString = StringArgumentType.getString(it, "typed_arg_1") println(theString) } } } } } ``` --- README.md | 2 +- build.gradle.kts | 16 ++++--- settings.gradle.kts | 2 +- .../cn/taskeren/brigadierx/BrigadierX.kt | 25 ++--------- .../cn/taskeren/brigadierx/BrigadierXNew.kt | 18 ++++++++ .../cn/taskeren/sample/brigadier/TestNew.kt | 42 +++++++++++++++++++ 6 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 src/main/kotlin/cn/taskeren/brigadierx/BrigadierXNew.kt create mode 100644 src/test/kotlin/cn/taskeren/sample/brigadier/TestNew.kt diff --git a/README.md b/README.md index 52f4c23..58e41f0 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BrigadierX -[使用帮助/How to Use](https://nitu2003.github.io/brigadierX/index.html) +[使用帮助 / How to Use](https://taskeren.github.io/brigadierX/index.html) ## 导入项目 / Import Repository diff --git a/build.gradle.kts b/build.gradle.kts index 5d0cfe4..17a7aa2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,10 +1,12 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + plugins { - kotlin("jvm") version "1.7.10" + kotlin("jvm") version "1.9.0" `maven-publish` } group = "com.github.taskeren" -version = "1.2-SNAPSHOT" +version = "1.3-SNAPSHOT" repositories { mavenCentral() @@ -12,8 +14,6 @@ repositories { } dependencies { - implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.21") - api("com.mojang:brigadier:1.0.18") // JUnit5 @@ -25,12 +25,18 @@ tasks.test { useJUnitPlatform() } +tasks.withType { + kotlinOptions { + freeCompilerArgs += "-Xcontext-receivers" + } +} + publishing { publications { create("maven") { groupId = "com.github.taskeren" artifactId = "brigadierX" - version = "1.2.2" + version = "1.3.0" from(components["java"]) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 7bd8ccc..b4f13a3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1 +1 @@ -rootProject.name = "brigadierx" \ No newline at end of file +rootProject.name = "brigadierX" \ No newline at end of file diff --git a/src/main/kotlin/cn/taskeren/brigadierx/BrigadierX.kt b/src/main/kotlin/cn/taskeren/brigadierx/BrigadierX.kt index a50385d..840cead 100644 --- a/src/main/kotlin/cn/taskeren/brigadierx/BrigadierX.kt +++ b/src/main/kotlin/cn/taskeren/brigadierx/BrigadierX.kt @@ -13,11 +13,13 @@ import com.mojang.brigadier.context.CommandContext /** * LiteralArgumentBuilder 构造方法语法糖 */ +@Deprecated("Removal", ReplaceWith("LiteralArgumentBuilder.literal(name)"), DeprecationLevel.WARNING) fun newLiteralArgBuilder(name: String): LiteralArgumentBuilder = LiteralArgumentBuilder.literal(name) /** * LiteralArgumentBuilder 构造方法语法糖 */ +@Deprecated("Removal", ReplaceWith("LiteralArgumentBuilder.literal(name).apply { func.invoke(this) }"), DeprecationLevel.WARNING) fun newLiteralArgBuilder(name: String, func: LiteralArgumentBuilder.() -> Unit): LiteralArgumentBuilder = LiteralArgumentBuilder.literal(name).apply { func.invoke(this) } /** @@ -28,20 +30,14 @@ fun newLiteralArgBuilder(name: String, func: LiteralArgumentBuilder.() -> * @return Dispatcher */ fun CommandDispatcher.register(name: String, func: LiteralArgumentBuilder.() -> Unit): CommandDispatcher { - val rootCommand = newLiteralArgBuilder(name) + val rootCommand = LiteralArgumentBuilder.literal(name) func.invoke(rootCommand) this.register(rootCommand) return this } -/* ================================== - * - * literal - * - * ================================== */ - fun LiteralArgumentBuilder.literal(name: String): LiteralArgumentBuilder { - val subcommand = newLiteralArgBuilder(name) + val subcommand = LiteralArgumentBuilder.literal(name) this.then(subcommand) return subcommand } @@ -66,12 +62,6 @@ fun RequiredArgumentBuilder.literal(name: String, func: LiteralArgu return subcommand } -/* ================================== - * - * argument - * - * ================================== */ - fun LiteralArgumentBuilder.argument(name: String, type: ArgumentType): RequiredArgumentBuilder { val rab = RequiredArgumentBuilder.argument(name, type) this.then(rab) @@ -98,13 +88,6 @@ fun RequiredArgumentBuilder.argument(name: String, type: Argu return rab } -/* ================================== - * - * Modified: executes - * executesX - * - * ================================== */ - fun , R> ArgumentBuilder.executesX(func: (CommandContext) -> R) { this.executes { func.invoke(it) diff --git a/src/main/kotlin/cn/taskeren/brigadierx/BrigadierXNew.kt b/src/main/kotlin/cn/taskeren/brigadierx/BrigadierXNew.kt new file mode 100644 index 0000000..9b56106 --- /dev/null +++ b/src/main/kotlin/cn/taskeren/brigadierx/BrigadierXNew.kt @@ -0,0 +1,18 @@ +package cn.taskeren.brigadierx + +import com.mojang.brigadier.CommandDispatcher +import com.mojang.brigadier.arguments.ArgumentType +import com.mojang.brigadier.builder.LiteralArgumentBuilder +import com.mojang.brigadier.builder.RequiredArgumentBuilder + +operator fun CommandDispatcher.invoke(block: CommandDispatcher.() -> Unit) = block(this) + +context(CommandDispatcher) +operator fun String.invoke(block: LiteralArgumentBuilder.() -> Unit) = register(this, block) + +context(CommandDispatcher<*>, LiteralArgumentBuilder) +operator fun String.invoke(block: LiteralArgumentBuilder.() -> Unit) = literal(this, block) + +context(CommandDispatcher<*>, LiteralArgumentBuilder) +operator fun String.invoke(type: ArgumentType, block: RequiredArgumentBuilder.() -> Unit) = + argument(this, type, block) \ No newline at end of file diff --git a/src/test/kotlin/cn/taskeren/sample/brigadier/TestNew.kt b/src/test/kotlin/cn/taskeren/sample/brigadier/TestNew.kt new file mode 100644 index 0000000..c2432eb --- /dev/null +++ b/src/test/kotlin/cn/taskeren/sample/brigadier/TestNew.kt @@ -0,0 +1,42 @@ +package cn.taskeren.sample.brigadier + +import cn.taskeren.brigadierx.executesX +import cn.taskeren.brigadierx.invoke +import com.mojang.brigadier.CommandDispatcher +import com.mojang.brigadier.arguments.StringArgumentType + +fun main() { + TestNew().testCase1() +} + +internal class TestNew { + + fun testCase1() { + val dispatcher = CommandDispatcher() + + dispatcher { + "help" { + "what" { + + "what"(StringArgumentType.greedyString()) { + executesX { + val what = StringArgumentType.getString(it, "what") + println("Help What? $what") + } + } + + executesX { + println("Idk what to help!") + } + } + + executesX { + println("Help!") + } + } + } + + dispatcher.execute(readlnOrNull(), object {}) + } + +} \ No newline at end of file