mirror of
https://github.com/Minestom/Minestom.git
synced 2025-02-11 18:02:08 +01:00
Reduce boilerplate, add missing toString method
This commit is contained in:
parent
f489f95bb7
commit
c94344a22e
@ -1,60 +1,11 @@
|
||||
package net.minestom.server.command.builder.arguments.number;
|
||||
|
||||
import net.minestom.server.command.builder.NodeMaker;
|
||||
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
||||
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ArgumentDouble extends ArgumentNumber<Double> {
|
||||
|
||||
public ArgumentDouble(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Double parse(@NotNull String input) throws ArgumentSyntaxException {
|
||||
try {
|
||||
final double value;
|
||||
{
|
||||
String parsed = parseValue(input);
|
||||
int radix = getRadix(input);
|
||||
if (radix != 10) {
|
||||
value = (double) Long.parseLong(parsed, radix);
|
||||
} else {
|
||||
value = Double.parseDouble(parsed);
|
||||
}
|
||||
}
|
||||
|
||||
// Check range
|
||||
if (hasMin && value < min) {
|
||||
throw new ArgumentSyntaxException("Input is lower than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
if (hasMax && value > max) {
|
||||
throw new ArgumentSyntaxException("Input is higher than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
|
||||
return value;
|
||||
} catch (NumberFormatException | NullPointerException e) {
|
||||
throw new ArgumentSyntaxException("Input is not a number/long", input, NOT_NUMBER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
|
||||
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
|
||||
|
||||
argumentNode.parser = "brigadier:double";
|
||||
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
|
||||
packetWriter.writeByte(getNumberProperties());
|
||||
if (this.hasMin())
|
||||
packetWriter.writeDouble(this.getMin());
|
||||
if (this.hasMax())
|
||||
packetWriter.writeDouble(this.getMax());
|
||||
});
|
||||
|
||||
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
|
||||
super(id, "brigadier:double", Double::parseDouble, ((s, radix) -> (double) Long.parseLong(s, radix)), BinaryWriter::writeDouble, Double::compare);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,60 +1,11 @@
|
||||
package net.minestom.server.command.builder.arguments.number;
|
||||
|
||||
import net.minestom.server.command.builder.NodeMaker;
|
||||
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
||||
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ArgumentFloat extends ArgumentNumber<Float> {
|
||||
|
||||
public ArgumentFloat(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Float parse(@NotNull String input) throws ArgumentSyntaxException {
|
||||
try {
|
||||
final float value;
|
||||
{
|
||||
String parsed = parseValue(input);
|
||||
int radix = getRadix(input);
|
||||
if (radix != 10) {
|
||||
value = (float) Integer.parseInt(parsed, radix);
|
||||
} else {
|
||||
value = Float.parseFloat(parsed);
|
||||
}
|
||||
}
|
||||
|
||||
// Check range
|
||||
if (hasMin && value < min) {
|
||||
throw new ArgumentSyntaxException("Input is lower than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
if (hasMax && value > max) {
|
||||
throw new ArgumentSyntaxException("Input is higher than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
|
||||
return value;
|
||||
} catch (NumberFormatException | NullPointerException e) {
|
||||
throw new ArgumentSyntaxException("Input is not a number/long", input, NOT_NUMBER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
|
||||
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
|
||||
|
||||
argumentNode.parser = "brigadier:float";
|
||||
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
|
||||
packetWriter.writeByte(getNumberProperties());
|
||||
if (this.hasMin())
|
||||
packetWriter.writeFloat(this.getMin());
|
||||
if (this.hasMax())
|
||||
packetWriter.writeFloat(this.getMax());
|
||||
});
|
||||
|
||||
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
|
||||
super(id, "brigadier:float", Float::parseFloat, (s, radix) -> (float) Integer.parseInt(s, radix), BinaryWriter::writeFloat, Float::compare);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,51 +1,11 @@
|
||||
package net.minestom.server.command.builder.arguments.number;
|
||||
|
||||
import net.minestom.server.command.builder.NodeMaker;
|
||||
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
||||
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ArgumentInteger extends ArgumentNumber<Integer> {
|
||||
|
||||
public ArgumentInteger(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Integer parse(@NotNull String input) throws ArgumentSyntaxException {
|
||||
try {
|
||||
final int value = Integer.parseInt(parseValue(input), getRadix(input));
|
||||
|
||||
// Check range
|
||||
if (hasMin && value < min) {
|
||||
throw new ArgumentSyntaxException("Input is lower than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
if (hasMax && value > max) {
|
||||
throw new ArgumentSyntaxException("Input is higher than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
|
||||
return value;
|
||||
} catch (NumberFormatException | NullPointerException e) {
|
||||
throw new ArgumentSyntaxException("Input is not a number/long", input, NOT_NUMBER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
|
||||
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
|
||||
|
||||
argumentNode.parser = "brigadier:integer";
|
||||
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
|
||||
packetWriter.writeByte(getNumberProperties());
|
||||
if (this.hasMin())
|
||||
packetWriter.writeInt(this.getMin());
|
||||
if (this.hasMax())
|
||||
packetWriter.writeInt(this.getMax());
|
||||
});
|
||||
|
||||
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
|
||||
super(id, "brigadier:integer", Integer::parseInt, Integer::parseInt, BinaryWriter::writeInt, Integer::compare);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -1,51 +1,15 @@
|
||||
package net.minestom.server.command.builder.arguments.number;
|
||||
|
||||
import net.minestom.server.command.builder.NodeMaker;
|
||||
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
||||
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ArgumentLong extends ArgumentNumber<Long> {
|
||||
|
||||
public ArgumentLong(String id) {
|
||||
super(id);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Long parse(@NotNull String input) throws ArgumentSyntaxException {
|
||||
try {
|
||||
final long value = Long.parseLong(parseValue(input), getRadix(input));
|
||||
|
||||
// Check range
|
||||
if (hasMin && value < min) {
|
||||
throw new ArgumentSyntaxException("Input is lower than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
if (hasMax && value > max) {
|
||||
throw new ArgumentSyntaxException("Input is higher than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
|
||||
return value;
|
||||
} catch (NumberFormatException | NullPointerException e) {
|
||||
throw new ArgumentSyntaxException("Input is not a number/long", input, NOT_NUMBER_ERROR);
|
||||
}
|
||||
super(id, "brigadier:long", Long::parseLong, Long::parseLong, BinaryWriter::writeLong, Long::compare);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
|
||||
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
|
||||
|
||||
argumentNode.parser = "brigadier:long";
|
||||
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
|
||||
packetWriter.writeByte(getNumberProperties());
|
||||
if (this.hasMin())
|
||||
packetWriter.writeLong(this.getMin());
|
||||
if (this.hasMax())
|
||||
packetWriter.writeLong(this.getMax());
|
||||
});
|
||||
|
||||
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
|
||||
public String toString() {
|
||||
return String.format("Long<%s>", getId());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,13 +1,21 @@
|
||||
package net.minestom.server.command.builder.arguments.number;
|
||||
|
||||
import net.minestom.server.command.builder.NodeMaker;
|
||||
import net.minestom.server.command.builder.arguments.Argument;
|
||||
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
|
||||
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Comparator;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public abstract class ArgumentNumber<T extends Number> extends Argument<T> {
|
||||
public class ArgumentNumber<T extends Number> extends Argument<T> {
|
||||
|
||||
public static final int NOT_NUMBER_ERROR = 1;
|
||||
public static final int RANGE_ERROR = 2;
|
||||
@ -15,8 +23,62 @@ public abstract class ArgumentNumber<T extends Number> extends Argument<T> {
|
||||
protected boolean hasMin, hasMax;
|
||||
protected T min, max;
|
||||
|
||||
public ArgumentNumber(String id) {
|
||||
protected final String parserName;
|
||||
protected final BiFunction<String, Integer, T> radixParser;
|
||||
protected final Function<String, T> parser;
|
||||
protected final BiConsumer<BinaryWriter, T> propertiesWriter;
|
||||
protected final Comparator<T> comparator;
|
||||
|
||||
ArgumentNumber(@NotNull String id, String parserName, Function<String, T> parser,
|
||||
BiFunction<String, Integer, T> radixParser, BiConsumer<BinaryWriter, T> propertiesWriter,
|
||||
Comparator<T> comparator) {
|
||||
super(id);
|
||||
this.parserName = parserName;
|
||||
this.radixParser = radixParser;
|
||||
this.parser = parser;
|
||||
this.propertiesWriter = propertiesWriter;
|
||||
this.comparator = comparator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NotNull T parse(@NotNull String input) throws ArgumentSyntaxException {
|
||||
try {
|
||||
final T value;
|
||||
final int radix = getRadix(input);
|
||||
if (radix == 10) {
|
||||
value = parser.apply(parseValue(input));
|
||||
} else {
|
||||
value = radixParser.apply(parseValue(input), radix);
|
||||
}
|
||||
|
||||
// Check range
|
||||
if (hasMin && comparator.compare(value, min) < 0) {
|
||||
throw new ArgumentSyntaxException("Input is lower than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
if (hasMax && comparator.compare(value, max) > 0) {
|
||||
throw new ArgumentSyntaxException("Input is higher than the minimum required value", input, RANGE_ERROR);
|
||||
}
|
||||
|
||||
return value;
|
||||
} catch (NumberFormatException | NullPointerException e) {
|
||||
throw new ArgumentSyntaxException("Input is not a number/long", input, NOT_NUMBER_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
|
||||
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
|
||||
|
||||
argumentNode.parser = parserName;
|
||||
argumentNode.properties = BinaryWriter.makeArray(packetWriter -> {
|
||||
packetWriter.writeByte(getNumberProperties());
|
||||
if (this.hasMin())
|
||||
propertiesWriter.accept(packetWriter, getMin());
|
||||
if (this.hasMax())
|
||||
propertiesWriter.accept(packetWriter, getMax());
|
||||
});
|
||||
|
||||
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
Loading…
Reference in New Issue
Block a user