aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt')
-rw-r--r--src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt b/src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt
new file mode 100644
index 0000000..10772b0
--- /dev/null
+++ b/src/main/kotlin/commands/CaseInsensitiveLiteralCommandNode.kt
@@ -0,0 +1,75 @@
+
+
+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
+ }
+
+}