diff options
author | nea <nea@nea.moe> | 2023-09-04 17:44:57 +0200 |
---|---|---|
committer | nea <nea@nea.moe> | 2023-09-04 17:44:57 +0200 |
commit | ee5591684dc6bcdea6c44a62806d537bbb7e0cee (patch) | |
tree | 6efb98480716a953a576d53f019cd91e1ea39e5e /src/main/kotlin/moe/nea/firmament/commands/CaseInsensitiveLiteralCommandNode.kt | |
parent | 19231489adc73aa7aa41c89ff90eaff6d9dd7bd4 (diff) | |
download | Firmament-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.kt | 79 |
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 + } + +} |