parsers: component

This commit is contained in:
Bixilon 2022-05-23 16:17:55 +02:00
parent 7d40f0ec2d
commit 93d76eb51f
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
3 changed files with 95 additions and 1 deletions

View File

@ -19,6 +19,7 @@ import de.bixilon.minosoft.commands.parser.brigadier._int.IntParser
import de.bixilon.minosoft.commands.parser.brigadier._long.LongParser
import de.bixilon.minosoft.commands.parser.brigadier.bool.BooleanParser
import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser
import de.bixilon.minosoft.commands.parser.minecraft.component.ChatComponentParser
import de.bixilon.minosoft.commands.parser.minecraft.coordinate.angle.AngleParser
import de.bixilon.minosoft.commands.parser.minecraft.coordinate.block.BlockPositionParser
import de.bixilon.minosoft.commands.parser.minecraft.coordinate.rotation.RotationParser
@ -61,6 +62,8 @@ object ArgumentParserFactories : DefaultFactory<ArgumentParserFactory<*>>(
AngleParser,
RotationParser,
ChatComponentParser,
DummyParser,
ScoreHolderParser,
@ -75,7 +78,6 @@ minecraft:block_predicate
minecraft:item_stack
minecraft:item_predicate
minecraft:color
minecraft:component
minecraft:message
minecraft:nbt
minecraft:nbt_path

View File

@ -0,0 +1,52 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.commands.parser.minecraft.component
import de.bixilon.minosoft.commands.parser.ArgumentParser
import de.bixilon.minosoft.commands.parser.brigadier.string.StringParser
import de.bixilon.minosoft.commands.parser.factory.ArgumentParserFactory
import de.bixilon.minosoft.commands.util.CommandReader
import de.bixilon.minosoft.data.registries.ResourceLocation
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
import de.bixilon.minosoft.util.KUtil.toResourceLocation
object ChatComponentParser : ArgumentParser<ChatComponent>, ArgumentParserFactory<ChatComponentParser> {
override val RESOURCE_LOCATION: ResourceLocation = "minecraft:component".toResourceLocation()
override val examples: List<Any> = listOf("", "hello", """{"text":"hello world"}""")
private val parser = StringParser(StringParser.StringModes.GREEDY)
override val placeholder = ChatComponent.of("<angle>")
override fun parse(reader: CommandReader): ChatComponent {
if (!reader.canPeek()) {
return ChatComponent.EMPTY
}
val pointer = reader.pointer
try {
return ChatComponent.of(reader.readJson())
} catch (ignored: Throwable) {
}
reader.pointer = pointer
return ChatComponent.of(parser.parse(reader))
}
override fun getSuggestions(reader: CommandReader): List<Any> {
if (reader.readString()?.isBlank() != false) {
return examples
}
return emptyList()
}
override fun read(buffer: PlayInByteBuffer) = this
}

View File

@ -0,0 +1,40 @@
/*
* Minosoft
* Copyright (C) 2020-2022 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.commands.parser.minecraft.component
import de.bixilon.minosoft.commands.util.CommandReader
import org.junit.jupiter.api.Test
import kotlin.test.assertEquals
internal class ChatComponentParserTest {
@Test
fun readEmpty() {
val reader = CommandReader("")
assertEquals(ChatComponentParser.parse(reader).message, "")
}
@Test
fun readHelloWorld() {
val reader = CommandReader("hello world")
assertEquals(ChatComponentParser.parse(reader).message, "hello world")
}
@Test
fun readBasicJsonText() {
val reader = CommandReader("""{"text":"hello world"}""")
assertEquals(ChatComponentParser.parse(reader).message, "hello world")
}
}