Update args

This commit is contained in:
Noel Németh 2022-07-08 17:57:27 +02:00
parent 5c8cf728c2
commit 6811e39137
6 changed files with 36 additions and 75 deletions

View File

@ -39,7 +39,7 @@ public final class CommandReader {
return s.substring(1, s.length()-1).replaceAll("\\\\\"", "\"");
}
public String getRemaining() {
public String readRemaining() {
return read(input.length());
}

View File

@ -1,7 +1,6 @@
package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.utils.StringUtils;
import net.minestom.server.command.CommandReader;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@ -12,21 +11,28 @@ import org.jetbrains.annotations.Nullable;
* Example: "Hey I am a string"
*/
public class ArgumentString extends Argument<String> {
private static final char BACKSLASH = '\\';
private static final char DOUBLE_QUOTE = '"';
private static final char QUOTE = '\'';
public static final int QUOTE_ERROR = 1;
public ArgumentString(String id) {
super(id, true);
super(id);
}
@NotNull
@Override
public String parse(@NotNull String input) throws ArgumentSyntaxException {
return staticParse(input);
public @NotNull Result<String> parse(CommandReader reader) {
//todo check if we should support '
final char c = reader.peekNextChar();
if (c == DOUBLE_QUOTE) {
try {
return Result.success(reader.readQuotedString());
} catch (Exception e) {
return Result.syntaxError("String doesn't have closing quotes", reader.readRemaining(), QUOTE_ERROR);
}
} else {
return Result.success(reader.readWord());
}
}
@Override
@ -41,43 +47,6 @@ public class ArgumentString extends Argument<String> {
});
}
/**
* @deprecated use {@link Argument#parse(Argument)}
*/
@Deprecated
public static String staticParse(@NotNull String input) throws ArgumentSyntaxException {
// Return if not quoted
if (!input.contains(String.valueOf(DOUBLE_QUOTE)) &&
!input.contains(String.valueOf(QUOTE)) &&
!input.contains(StringUtils.SPACE)) {
return input;
}
// Check if value start and end with quote
final char first = input.charAt(0);
final char last = input.charAt(input.length() - 1);
final boolean quote = input.length() >= 2 &&
first == last && (first == DOUBLE_QUOTE || first == QUOTE);
if (!quote)
throw new ArgumentSyntaxException("String argument needs to start and end with quotes", input, QUOTE_ERROR);
// Remove first and last characters (quotes)
input = input.substring(1, input.length() - 1);
// Verify backslashes
for (int i = 1; i < input.length(); i++) {
final char c = input.charAt(i);
if (c == first) {
final char lastChar = input.charAt(i - 1);
if (lastChar != BACKSLASH) {
throw new ArgumentSyntaxException("Non-escaped quote", input, QUOTE_ERROR);
}
}
}
return StringUtils.unescapeJavaString(input);
}
@Override
public String toString() {
return String.format("String<%s>", getId());

View File

@ -1,27 +1,29 @@
package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.CommandReader;
import net.minestom.server.utils.StringUtils;
import net.minestom.server.utils.binary.BinaryWriter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.regex.Pattern;
/**
* Represents an argument which will take all the remaining of the command.
* <p>
* Example: Hey I am a string
*/
public class ArgumentStringArray extends Argument<String[]> {
//todo maybe deprecate? this arg doesn't make sense, the user isn't a baby they can cut it themselves
public static final byte[] prop = BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(2); // Greedy phrase
});
public ArgumentStringArray(String id) {
super(id, true, true);
super(id);
}
@NotNull
@Override
public String[] parse(@NotNull String input) {
return input.split(Pattern.quote(StringUtils.SPACE));
public @NotNull Result<String[]> parse(CommandReader reader) {
return Result.success(reader.readRemaining().split(StringUtils.SPACE));
}
@Override
@ -31,9 +33,7 @@ public class ArgumentStringArray extends Argument<String[]> {
@Override
public byte @Nullable [] nodeProperties() {
return BinaryWriter.makeArray(packetWriter -> {
packetWriter.writeVarInt(2); // Greedy phrase
});
return prop;
}
@Override

View File

@ -1,7 +1,6 @@
package net.minestom.server.command.builder.arguments;
import net.minestom.server.command.CommandReader;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.utils.binary.BinaryWriter;
import net.minestom.server.utils.validate.Check;
import org.jetbrains.annotations.NotNull;
@ -27,21 +26,19 @@ public class ArgumentWord extends Argument<String> {
}
@Override
public @NotNull String parse(CommandReader reader) throws ArgumentSyntaxException {
final String word = reader.getWord();
public @NotNull Result<String> parse(CommandReader reader) {
final String word = reader.readWord();
// Check restrictions (acting as literal)
if (hasRestrictions()) {
for (String r : restrictions) {
if (word.equals(r)) {
reader.consume();
return word;
return Result.success(word);
}
}
throw new ArgumentSyntaxException("Word needs to be in the restriction list", word, RESTRICTION_ERROR);
return Result.incompatibleType();
}
reader.consume();
return word;
return Result.success(word);
}
/**

View File

@ -2,7 +2,6 @@ package net.minestom.server.command.builder.arguments.minecraft;
import net.minestom.server.command.CommandReader;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import org.jetbrains.annotations.NotNull;
public class ArgumentResourceLocation extends Argument<String> {
@ -12,10 +11,9 @@ public class ArgumentResourceLocation extends Argument<String> {
}
@Override
public @NotNull String parse(CommandReader reader) throws ArgumentSyntaxException {
final String input = reader.getWord();
reader.consume();
return input;
public @NotNull Result<String> parse(CommandReader reader) {
//todo shouldn't this have some syntax checks?
return Result.success(reader.readWord());
}
@Override

View File

@ -2,7 +2,6 @@ package net.minestom.server.command.builder.arguments.minecraft;
import net.minestom.server.command.CommandReader;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
@ -16,14 +15,12 @@ public class ArgumentUUID extends Argument<UUID> {
}
@Override
public @NotNull UUID parse(CommandReader reader) throws ArgumentSyntaxException {
final String input = reader.getWord();
public @NotNull Result<UUID> parse(CommandReader reader) {
final String input = reader.readWord();
try {
final UUID uuid = UUID.fromString(input);
reader.consume();
return uuid;
return Result.success(UUID.fromString(input));
} catch (IllegalArgumentException exception) {
throw new ArgumentSyntaxException("Invalid UUID", input, INVALID_UUID);
return Result.syntaxError("Invalid UUID", input, INVALID_UUID);
}
}