From c94344a22e42070bc74e07c7ed3a936b2a3085dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9meth=20Noel?= Date: Tue, 10 Aug 2021 22:18:11 +0200 Subject: [PATCH] Reduce boilerplate, add missing toString method --- .../arguments/number/ArgumentDouble.java | 51 +------------- .../arguments/number/ArgumentFloat.java | 51 +------------- .../arguments/number/ArgumentInteger.java | 42 +----------- .../arguments/number/ArgumentLong.java | 42 +----------- .../arguments/number/ArgumentNumber.java | 66 ++++++++++++++++++- 5 files changed, 70 insertions(+), 182 deletions(-) diff --git a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentDouble.java b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentDouble.java index 6dbcd545d..49548fdae 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentDouble.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentDouble.java @@ -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 { 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 diff --git a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentFloat.java b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentFloat.java index ab685e371..93094da62 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentFloat.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentFloat.java @@ -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 { 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 diff --git a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentInteger.java b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentInteger.java index 6350e9b35..0baf8fc10 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentInteger.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentInteger.java @@ -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 { 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 diff --git a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentLong.java b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentLong.java index a7893e085..cc2984db7 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentLong.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentLong.java @@ -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 { 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()); } - } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentNumber.java b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentNumber.java index a074fab6a..1358c9ee2 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentNumber.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/number/ArgumentNumber.java @@ -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 extends Argument { +public class ArgumentNumber extends Argument { public static final int NOT_NUMBER_ERROR = 1; public static final int RANGE_ERROR = 2; @@ -15,8 +23,62 @@ public abstract class ArgumentNumber extends Argument { protected boolean hasMin, hasMax; protected T min, max; - public ArgumentNumber(String id) { + protected final String parserName; + protected final BiFunction radixParser; + protected final Function parser; + protected final BiConsumer propertiesWriter; + protected final Comparator comparator; + + ArgumentNumber(@NotNull String id, String parserName, Function parser, + BiFunction radixParser, BiConsumer propertiesWriter, + Comparator 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