From 7d40f0ec2d48bc3f28f5a2f2d0e447ffe9d1409e Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 23 May 2022 15:11:53 +0200 Subject: [PATCH] command reader: json reading --- .../minosoft/commands/util/CommandReader.kt | 8 ++++++ .../minosoft/commands/util/JsonReader.kt | 26 +++++++++++++++++++ .../commands/util/CommandReaderTest.kt | 19 ++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 src/main/java/de/bixilon/minosoft/commands/util/JsonReader.kt diff --git a/src/main/java/de/bixilon/minosoft/commands/util/CommandReader.kt b/src/main/java/de/bixilon/minosoft/commands/util/CommandReader.kt index 1fd49b1d6..4eb78db18 100644 --- a/src/main/java/de/bixilon/minosoft/commands/util/CommandReader.kt +++ b/src/main/java/de/bixilon/minosoft/commands/util/CommandReader.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.commands.util import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.commands.errors.reader.* import de.bixilon.minosoft.commands.errors.reader.map.DuplicatedKeyMapError import de.bixilon.minosoft.commands.errors.reader.map.ExpectedKeyMapError @@ -22,6 +23,7 @@ import de.bixilon.minosoft.commands.errors.reader.map.InvalidMapSeparatorError import de.bixilon.minosoft.commands.errors.reader.number.NegativeNumberError import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.util.KUtil.toResourceLocation +import de.bixilon.minosoft.util.json.Jackson open class CommandReader(val string: String) { var pointer = 0 @@ -359,6 +361,12 @@ open class CommandReader(val string: String) { return map } + + fun readJson(): JsonObject { + skipWhitespaces() + return Jackson.MAPPER.readValue(JsonReader(this), Jackson.JSON_MAP_TYPE) + } + override fun toString(): String { return string.substring(pointer, string.length) } diff --git a/src/main/java/de/bixilon/minosoft/commands/util/JsonReader.kt b/src/main/java/de/bixilon/minosoft/commands/util/JsonReader.kt new file mode 100644 index 000000000..7c3d10934 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/commands/util/JsonReader.kt @@ -0,0 +1,26 @@ +/* + * 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 . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.commands.util + +import java.io.Reader + +class JsonReader(val reader: CommandReader) : Reader() { + + override fun read(cbuf: CharArray, off: Int, len: Int): Int { + cbuf[0] = reader.readNext()?.toChar() ?: return 0 + return 1 + } + + override fun close() = Unit +} diff --git a/src/test/java/de/bixilon/minosoft/commands/util/CommandReaderTest.kt b/src/test/java/de/bixilon/minosoft/commands/util/CommandReaderTest.kt index 97c62a9a8..0359e3f34 100644 --- a/src/test/java/de/bixilon/minosoft/commands/util/CommandReaderTest.kt +++ b/src/test/java/de/bixilon/minosoft/commands/util/CommandReaderTest.kt @@ -182,4 +182,23 @@ internal class CommandReaderTest { assertEquals(read, "not") assertFalse(negated) } + + @Test + fun readEmptyJson() { + val reader = CommandReader("{}") + assertEquals(reader.readJson(), emptyMap()) + } + + @Test + fun readBasicJson() { + val reader = CommandReader("""{"test": 123}""") + assertEquals(reader.readJson(), mapOf("test" to 123)) + } + + @Test + fun readJsonWithTrailingData() { + val reader = CommandReader("""{"test": 123} abc""") + assertEquals(reader.readJson(), mapOf("test" to 123)) + assertEquals(reader.readString(), "abc") + } }