aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt
diff options
context:
space:
mode:
authornea <nea@nea.moe>2023-09-04 17:44:57 +0200
committernea <nea@nea.moe>2023-09-04 17:44:57 +0200
commitee5591684dc6bcdea6c44a62806d537bbb7e0cee (patch)
tree6efb98480716a953a576d53f019cd91e1ea39e5e /src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt
parent19231489adc73aa7aa41c89ff90eaff6d9dd7bd4 (diff)
downloadFirmament-ee5591684dc6bcdea6c44a62806d537bbb7e0cee.tar.gz
Firmament-ee5591684dc6bcdea6c44a62806d537bbb7e0cee.tar.bz2
Firmament-ee5591684dc6bcdea6c44a62806d537bbb7e0cee.zip
Add support for case insensitive commands (/fIrM)
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt')
-rw-r--r--src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt b/src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt
new file mode 100644
index 0000000..b819a5a
--- /dev/null
+++ b/src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt
@@ -0,0 +1,79 @@
+/*
+ * SPDX-FileCopyrightText: 2023 Linnea Gräf <nea@nea.moe>
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+package moe.nea.firmament.commands
+
+import com.mojang.brigadier.Command
+import com.mojang.brigadier.RedirectModifier
+import com.mojang.brigadier.StringReader
+import com.mojang.brigadier.builder.LiteralArgumentBuilder
+import com.mojang.brigadier.context.CommandContextBuilder
+import com.mojang.brigadier.context.StringRange
+import com.mojang.brigadier.exceptions.CommandSyntaxException
+import com.mojang.brigadier.tree.CommandNode
+import com.mojang.brigadier.tree.LiteralCommandNode
+import java.util.function.Predicate
+
+class CaseInsensitiveLiteralCommandNode<S>(
+ literal: String, command: Command<S>?, requirement: Predicate<S>?,
+ redirect: CommandNode<S>?, modifier: RedirectModifier<S>?, forks: Boolean
+) : LiteralCommandNode<S>(
+ literal.lowercase(), command, requirement, redirect, modifier, forks
+) {
+ class Builder<S>(literal: String) : LiteralArgumentBuilder<S>(literal) {
+ override fun build(): LiteralCommandNode<S> {
+ val result = CaseInsensitiveLiteralCommandNode(
+ literal,
+ command, requirement, redirect, redirectModifier, isFork
+ )
+ for (argument in arguments) {
+ result.addChild(argument)
+ }
+ return result
+ }
+ }
+
+ override fun createBuilder(): LiteralArgumentBuilder<S> {
+ return Builder<S>(literal).also {
+ it.requires(requirement)
+ it.forward(redirect, redirectModifier, isFork)
+ if (command != null)
+ it.executes(command)
+ }
+ }
+
+ override fun parse(reader: StringReader, contextBuilder: CommandContextBuilder<S>) {
+ val start = reader.cursor
+ val end = parse0(reader)
+ if (end > -1) {
+ contextBuilder.withNode(this, StringRange.between(start, end))
+ return
+ }
+
+ throw CommandSyntaxException.BUILT_IN_EXCEPTIONS.literalIncorrect().createWithContext(reader, literal)
+ }
+
+ override fun toString(): String {
+ return "<iliteral $literal>"
+ }
+
+ private fun parse0(reader: StringReader): Int {
+ val start = reader.cursor
+ if (reader.canRead(literal.length)) {
+ val end = start + literal.length
+ if (reader.string.substring(start, end).equals(literal, true)) {
+ reader.cursor = end
+ if (!reader.canRead() || reader.peek() == ' ') {
+ return end
+ } else {
+ reader.cursor = start
+ }
+ }
+ }
+ return -1
+ }
+
+}