diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java index 1538a4fc..04f79f4b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java @@ -59,7 +59,7 @@ public final class ByteArgument extends CommandArgument { } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -70,7 +70,7 @@ public final class ByteArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link ByteArgument}. * * @param name Argument name * @param Command sender type @@ -81,7 +81,7 @@ public final class ByteArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link ByteArgument}. * * @param name Argument name * @param Command sender type @@ -92,7 +92,7 @@ public final class ByteArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new optional {@link ByteArgument} with the specified default value. * * @param name Argument name * @param defaultNum Default num @@ -103,7 +103,7 @@ public final class ByteArgument extends CommandArgument { final @NonNull String name, final byte defaultNum ) { - return ByteArgument.newBuilder(name).asOptionalWithDefault(Byte.toString(defaultNum)).build(); + return ByteArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -126,8 +126,8 @@ public final class ByteArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private byte min = Byte.MIN_VALUE; - private byte max = Byte.MAX_VALUE; + private byte min = ByteParser.DEFAULT_MINIMUM; + private byte max = ByteParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Byte.class, name); @@ -155,6 +155,18 @@ public final class ByteArgument extends CommandArgument { return this; } + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 + */ + public @NonNull Builder asOptionalWithDefault(final byte defaultValue) { + return (Builder) this.asOptionalWithDefault(Byte.toString(defaultValue)); + } + /** * Builder a new byte argument * @@ -171,6 +183,20 @@ public final class ByteArgument extends CommandArgument { public static final class ByteParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final byte DEFAULT_MINIMUM = Byte.MIN_VALUE; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final byte DEFAULT_MAXIMUM = Byte.MAX_VALUE; + private final byte min; private final byte max; @@ -192,32 +218,17 @@ public final class ByteArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - ByteParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(ByteParser.class, commandContext)); } try { final byte value = Byte.parseByte(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure( - new ByteParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new ByteParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure( - new ByteParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new ByteParseException(input, this, commandContext)); } } @@ -252,6 +263,28 @@ public final class ByteArgument extends CommandArgument { return this.min; } + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + } @@ -262,6 +295,8 @@ public final class ByteArgument extends CommandArgument { private static final long serialVersionUID = -4724241304872989208L; + private final ByteParser parser; + /** * Construct a new byte parse exception * @@ -269,30 +304,43 @@ public final class ByteArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param context Command context + * @deprecated use {@link #ByteParseException(String, ByteParser, CommandContext)} instead */ + @Deprecated public ByteParseException( final @NonNull String input, final byte min, final byte max, final @NonNull CommandContext context ) { - super( - input, - min, - max, - ByteParser.class, - context - ); + this(input, new ByteParser<>(min, max), context); + } + + /** + * Create a new {@link ByteParseException}. + * + * @param input input string + * @param parser byte parser + * @param context command context + * @since 1.5.0 + */ + public ByteParseException( + final @NonNull String input, + final @NonNull ByteParser parser, + final @NonNull CommandContext context + ) { + super(input, parser.min, parser.max, ByteParser.class, context); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().byteValue() != Byte.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().byteValue() != Byte.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java index 38bdee74..d433b477 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java @@ -59,7 +59,7 @@ public final class DoubleArgument extends CommandArgument { } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -70,7 +70,7 @@ public final class DoubleArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link DoubleArgument}. * * @param name Argument name * @param Command sender type @@ -81,7 +81,7 @@ public final class DoubleArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link DoubleArgument}. * * @param name Argument name * @param Command sender type @@ -92,7 +92,7 @@ public final class DoubleArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new optional {@link DoubleArgument} with the specified default value. * * @param name Argument name * @param defaultNum Default num @@ -103,7 +103,7 @@ public final class DoubleArgument extends CommandArgument { final @NonNull String name, final double defaultNum ) { - return DoubleArgument.newBuilder(name).asOptionalWithDefault(Double.toString(defaultNum)).build(); + return DoubleArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -126,8 +126,8 @@ public final class DoubleArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private double min = Double.NEGATIVE_INFINITY; - private double max = Double.POSITIVE_INFINITY; + private double min = DoubleParser.DEFAULT_MINIMUM; + private double max = DoubleParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Double.class, name); @@ -155,6 +155,18 @@ public final class DoubleArgument extends CommandArgument { return this; } + /** + * Sets the command argument to be optional, with the specified default value. + * + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 + */ + public @NonNull Builder asOptionalWithDefault(final double defaultValue) { + return (Builder) this.asOptionalWithDefault(Double.toString(defaultValue)); + } + /** * Builder a new double argument * @@ -171,6 +183,20 @@ public final class DoubleArgument extends CommandArgument { public static final class DoubleParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final double DEFAULT_MINIMUM = Double.NEGATIVE_INFINITY; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final double DEFAULT_MAXIMUM = Double.POSITIVE_INFINITY; + private final double min; private final double max; @@ -192,30 +218,17 @@ public final class DoubleArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - DoubleParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(DoubleParser.class, commandContext)); } try { final double value = Double.parseDouble(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure(new DoubleParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new DoubleParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure(new DoubleParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new DoubleParseException(input, this, commandContext)); } } @@ -242,6 +255,28 @@ public final class DoubleArgument extends CommandArgument { return this.min; } + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + } @@ -249,6 +284,8 @@ public final class DoubleArgument extends CommandArgument { private static final long serialVersionUID = 1764554911581976586L; + private final DoubleParser parser; + /** * Construct a new double parse exception * @@ -256,30 +293,43 @@ public final class DoubleArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param commandContext Command context + * @deprecated use {@link #DoubleParseException(String, DoubleParser, CommandContext)} instead */ + @Deprecated public DoubleParseException( final @NonNull String input, final double min, final double max, final @NonNull CommandContext commandContext ) { - super( - input, - min, - max, - DoubleParser.class, - commandContext - ); + this(input, new DoubleParser<>(min, max), commandContext); + } + + /** + * Create a new {@link DoubleParseException}. + * + * @param input input string + * @param parser double parser + * @param commandContext command context + * @since 1.5.0 + */ + public DoubleParseException( + final @NonNull String input, + final @NonNull DoubleParser parser, + final @NonNull CommandContext commandContext + ) { + super(input, parser.min, parser.max, DoubleParser.class, commandContext); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().doubleValue() != Double.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().doubleValue() != Double.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java index 19eb951c..e28e0ec5 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java @@ -59,7 +59,7 @@ public final class FloatArgument extends CommandArgument { } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -70,7 +70,7 @@ public final class FloatArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link FloatArgument}. * * @param name Argument name * @param Command sender type @@ -81,7 +81,7 @@ public final class FloatArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link FloatArgument}. * * @param name Argument name * @param Command sender type @@ -92,7 +92,7 @@ public final class FloatArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new optional {@link FloatArgument} with the specified default value. * * @param name Argument name * @param defaultNum Default num @@ -103,7 +103,7 @@ public final class FloatArgument extends CommandArgument { final @NonNull String name, final float defaultNum ) { - return FloatArgument.newBuilder(name).asOptionalWithDefault(Float.toString(defaultNum)).build(); + return FloatArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -126,8 +126,8 @@ public final class FloatArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private float min = Float.NEGATIVE_INFINITY; - private float max = Float.POSITIVE_INFINITY; + private float min = FloatParser.DEFAULT_MINIMUM; + private float max = FloatParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Float.class, name); @@ -156,10 +156,17 @@ public final class FloatArgument extends CommandArgument { } /** - * Builder a new float argument + * Sets the command argument to be optional, with the specified default value. * - * @return Constructed argument + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 */ + public @NonNull Builder asOptionalWithDefault(final float defaultValue) { + return (Builder) this.asOptionalWithDefault(Float.toString(defaultValue)); + } + @Override public @NonNull FloatArgument build() { return new FloatArgument<>(this.isRequired(), this.getName(), this.min, this.max, @@ -171,6 +178,20 @@ public final class FloatArgument extends CommandArgument { public static final class FloatParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final float DEFAULT_MINIMUM = Float.NEGATIVE_INFINITY; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final float DEFAULT_MAXIMUM = Float.POSITIVE_INFINITY; + private final float min; private final float max; @@ -192,30 +213,17 @@ public final class FloatArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - FloatParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(FloatParser.class, commandContext)); } try { final float value = Float.parseFloat(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure(new FloatParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new FloatParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure(new FloatParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new FloatParseException(input, this, commandContext)); } } @@ -242,6 +250,28 @@ public final class FloatArgument extends CommandArgument { return this.min; } + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + } @@ -249,6 +279,8 @@ public final class FloatArgument extends CommandArgument { private static final long serialVersionUID = -1162983846751812292L; + private final FloatParser parser; + /** * Construct a new float parse exception * @@ -256,30 +288,43 @@ public final class FloatArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param commandContext Command context + * @deprecated use {@link #FloatParseException(String, FloatParser, CommandContext)} instead */ + @Deprecated public FloatParseException( final @NonNull String input, final float min, final float max, final @NonNull CommandContext commandContext ) { - super( - input, - min, - max, - FloatParser.class, - commandContext - ); + this(input, new FloatParser<>(min, max), commandContext); + } + + /** + * Create a new {@link FloatParseException}. + * + * @param input input string + * @param parser float parser + * @param commandContext command context + * @since 1.5.0 + */ + public FloatParseException( + final @NonNull String input, + final @NonNull FloatParser parser, + final @NonNull CommandContext commandContext + ) { + super(input, parser.min, parser.max, FloatParser.class, commandContext); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().floatValue() != Float.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().floatValue() != Float.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java index 4f961699..dc675c09 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java @@ -55,18 +55,26 @@ public final class IntegerArgument extends CommandArgument { final @NonNull String name, final int min, final int max, - final String defaultValue, + final @NonNull String defaultValue, final @Nullable BiFunction<@NonNull CommandContext, @NonNull String, @NonNull List<@NonNull String>> suggestionsProvider, final @NonNull ArgumentDescription defaultDescription ) { - super(required, name, new IntegerParser<>(min, max), defaultValue, Integer.class, suggestionsProvider, defaultDescription); + super( + required, + name, + new IntegerParser<>(min, max), + defaultValue, + Integer.class, + suggestionsProvider, + defaultDescription + ); this.min = min; this.max = max; } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -77,7 +85,7 @@ public final class IntegerArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link IntegerArgument}. * * @param name Argument name * @param Command sender type @@ -88,7 +96,7 @@ public final class IntegerArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link IntegerArgument}. * * @param name Argument name * @param Command sender type @@ -99,18 +107,15 @@ public final class IntegerArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new required {@link IntegerArgument} with the specified default value. * * @param name Argument name - * @param defaultNum Default num + * @param defaultNum Default value * @param Command sender type * @return Created argument */ - public static @NonNull CommandArgument optional( - final @NonNull String name, - final int defaultNum - ) { - return IntegerArgument.newBuilder(name).asOptionalWithDefault(Integer.toString(defaultNum)).build(); + public static @NonNull CommandArgument optional(final @NonNull String name, final int defaultNum) { + return IntegerArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -133,8 +138,8 @@ public final class IntegerArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private int min = Integer.MIN_VALUE; - private int max = Integer.MAX_VALUE; + private int min = IntegerParser.DEFAULT_MINIMUM; + private int max = IntegerParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Integer.class, name); @@ -163,10 +168,17 @@ public final class IntegerArgument extends CommandArgument { } /** - * Builder a new integer argument + * Sets the command argument to be optional, with the specified default value. * - * @return Constructed argument + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 */ + public @NonNull Builder asOptionalWithDefault(final int defaultValue) { + return (Builder) this.asOptionalWithDefault(Integer.toString(defaultValue)); + } + @Override public @NonNull IntegerArgument build() { return new IntegerArgument<>(this.isRequired(), this.getName(), this.min, this.max, @@ -178,6 +190,20 @@ public final class IntegerArgument extends CommandArgument { public static final class IntegerParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final int DEFAULT_MINIMUM = Integer.MIN_VALUE; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final int DEFAULT_MAXIMUM = Integer.MAX_VALUE; + private final int min; private final int max; @@ -242,30 +268,17 @@ public final class IntegerArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - IntegerParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(IntegerParser.class, commandContext)); } try { final int value = Integer.parseInt(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure(new IntegerParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new IntegerParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure(new IntegerParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new IntegerParseException(input, this, commandContext)); } } @@ -287,6 +300,28 @@ public final class IntegerArgument extends CommandArgument { return this.max; } + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + @Override public boolean isContextFree() { return true; @@ -307,6 +342,8 @@ public final class IntegerArgument extends CommandArgument { private static final long serialVersionUID = -6933923056628373853L; + private final IntegerParser parser; + /** * Construct a new integer parse exception * @@ -314,30 +351,43 @@ public final class IntegerArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param commandContext Command context + * @deprecated use {@link #IntegerParseException(String, IntegerParser, CommandContext)} instead */ + @Deprecated public IntegerParseException( final @NonNull String input, final int min, final int max, final @NonNull CommandContext commandContext ) { - super( - input, - min, - max, - IntegerParser.class, - commandContext - ); + this(input, new IntegerParser<>(min, max), commandContext); + } + + /** + * Create a new {@link IntegerParseException}. + * + * @param input input string + * @param parser integer parser + * @param commandContext command context + * @since 1.5.0 + */ + public IntegerParseException( + final @NonNull String input, + final @NonNull IntegerParser parser, + final @NonNull CommandContext commandContext + ) { + super(input, parser.min, parser.max, IntegerParser.class, commandContext); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().intValue() != Integer.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().intValue() != Integer.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java index 2b1b28f0..4943621d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java @@ -59,7 +59,7 @@ public final class LongArgument extends CommandArgument { } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -70,7 +70,7 @@ public final class LongArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link LongArgument}. * * @param name Argument name * @param Command sender type @@ -81,7 +81,7 @@ public final class LongArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link LongArgument}. * * @param name Argument name * @param Command sender type @@ -92,7 +92,7 @@ public final class LongArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new optional {@link LongArgument} with the specified default value. * * @param name Argument name * @param defaultNum Default num @@ -103,7 +103,7 @@ public final class LongArgument extends CommandArgument { final @NonNull String name, final long defaultNum ) { - return LongArgument.newBuilder(name).asOptionalWithDefault(Long.toString(defaultNum)).build(); + return LongArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -126,8 +126,8 @@ public final class LongArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private long min = Long.MIN_VALUE; - private long max = Long.MAX_VALUE; + private long min = LongParser.DEFAULT_MINIMUM; + private long max = LongParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Long.class, name); @@ -156,10 +156,17 @@ public final class LongArgument extends CommandArgument { } /** - * Builder a new long argument + * Sets the command argument to be optional, with the specified default value. * - * @return Constructed argument + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 */ + public @NonNull Builder asOptionalWithDefault(final long defaultValue) { + return (Builder) this.asOptionalWithDefault(Long.toString(defaultValue)); + } + @Override public @NonNull LongArgument build() { return new LongArgument<>(this.isRequired(), this.getName(), this.min, @@ -171,6 +178,20 @@ public final class LongArgument extends CommandArgument { public static final class LongParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final long DEFAULT_MINIMUM = Long.MIN_VALUE; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final long DEFAULT_MAXIMUM = Long.MAX_VALUE; + private final long min; private final long max; @@ -192,33 +213,60 @@ public final class LongArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - LongParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(LongParser.class, commandContext)); } try { final long value = Long.parseLong(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure(new LongParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new LongParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure(new LongParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new LongParseException(input, this, commandContext)); } } + /** + * Get the minimum value accepted by this parser + * + * @return Min value + */ + public long getMin() { + return this.min; + } + + /** + * Get the maximum value accepted by this parser + * + * @return Max value + */ + public long getMax() { + return this.max; + } + + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + @Override public boolean isContextFree() { return true; @@ -239,6 +287,8 @@ public final class LongArgument extends CommandArgument { private static final long serialVersionUID = 4366856282301198232L; + private final LongParser parser; + /** * Construct a new long parse exception * @@ -246,30 +296,43 @@ public final class LongArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param commandContext Command context + * @deprecated use {@link #LongParseException(String, LongParser, CommandContext)} instead */ + @Deprecated public LongParseException( final @NonNull String input, final long min, final long max, final @NonNull CommandContext commandContext ) { - super( - input, - min, - max, - LongParser.class, - commandContext - ); + this(input, new LongParser<>(min, max), commandContext); + } + + /** + * Create a new {@link LongParseException}. + * + * @param input input string + * @param parser long parser + * @param commandContext command context + * @since 1.5.0 + */ + public LongParseException( + final @NonNull String input, + final @NonNull LongParser parser, + final @NonNull CommandContext commandContext + ) { + super(input, parser.min, parser.max, LongParser.class, commandContext); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().longValue() != Long.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().longValue() != Long.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java index 59ddf149..4e503141 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java @@ -59,7 +59,7 @@ public final class ShortArgument extends CommandArgument { } /** - * Create a new builder + * Create a new {@link Builder}. * * @param name Name of the argument * @param Command sender type @@ -70,7 +70,7 @@ public final class ShortArgument extends CommandArgument { } /** - * Create a new required command argument + * Create a new required {@link ShortArgument}. * * @param name Argument name * @param Command sender type @@ -81,7 +81,7 @@ public final class ShortArgument extends CommandArgument { } /** - * Create a new optional command argument + * Create a new optional {@link ShortArgument}. * * @param name Argument name * @param Command sender type @@ -92,18 +92,15 @@ public final class ShortArgument extends CommandArgument { } /** - * Create a new required command argument with a default value + * Create a new required {@link ShortArgument} with the specified default value. * * @param name Argument name - * @param defaultNum Default num + * @param defaultNum Default value * @param Command sender type * @return Created argument */ - public static @NonNull CommandArgument optional( - final @NonNull String name, - final short defaultNum - ) { - return ShortArgument.newBuilder(name).asOptionalWithDefault(Short.toString(defaultNum)).build(); + public static @NonNull CommandArgument optional(final @NonNull String name, final short defaultNum) { + return ShortArgument.newBuilder(name).asOptionalWithDefault(defaultNum).build(); } /** @@ -126,8 +123,8 @@ public final class ShortArgument extends CommandArgument { public static final class Builder extends CommandArgument.Builder { - private short min = Short.MIN_VALUE; - private short max = Short.MAX_VALUE; + private short min = ShortParser.DEFAULT_MINIMUM; + private short max = ShortParser.DEFAULT_MAXIMUM; private Builder(final @NonNull String name) { super(Short.class, name); @@ -156,10 +153,17 @@ public final class ShortArgument extends CommandArgument { } /** - * Builder a new short argument + * Sets the command argument to be optional, with the specified default value. * - * @return Constructed argument + * @param defaultValue default value + * @return this builder + * @see CommandArgument.Builder#asOptionalWithDefault(String) + * @since 1.5.0 */ + public @NonNull Builder asOptionalWithDefault(final short defaultValue) { + return (Builder) this.asOptionalWithDefault(Short.toString(defaultValue)); + } + @Override public @NonNull ShortArgument build() { return new ShortArgument<>(this.isRequired(), this.getName(), this.min, this.max, @@ -171,6 +175,20 @@ public final class ShortArgument extends CommandArgument { public static final class ShortParser implements ArgumentParser { + /** + * Constant for the default/unset minimum value. + * + * @since 1.5.0 + */ + public static final short DEFAULT_MINIMUM = Short.MIN_VALUE; + + /** + * Constant for the default/unset maximum value. + * + * @since 1.5.0 + */ + public static final short DEFAULT_MAXIMUM = Short.MAX_VALUE; + private final short min; private final short max; @@ -192,30 +210,17 @@ public final class ShortArgument extends CommandArgument { ) { final String input = inputQueue.peek(); if (input == null) { - return ArgumentParseResult.failure(new NoInputProvidedException( - ShortParser.class, - commandContext - )); + return ArgumentParseResult.failure(new NoInputProvidedException(ShortParser.class, commandContext)); } try { final short value = Short.parseShort(input); if (value < this.min || value > this.max) { - return ArgumentParseResult.failure(new ShortParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new ShortParseException(input, this, commandContext)); } inputQueue.remove(); return ArgumentParseResult.success(value); } catch (final Exception e) { - return ArgumentParseResult.failure(new ShortParseException( - input, - this.min, - this.max, - commandContext - )); + return ArgumentParseResult.failure(new ShortParseException(input, this, commandContext)); } } @@ -250,6 +255,28 @@ public final class ShortArgument extends CommandArgument { return this.min; } + /** + * Get whether this parser has a maximum set. + * This will compare the parser's maximum to {@link #DEFAULT_MAXIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMax() { + return this.max != DEFAULT_MAXIMUM; + } + + /** + * Get whether this parser has a minimum set. + * This will compare the parser's minimum to {@link #DEFAULT_MINIMUM}. + * + * @return whether the parser has a maximum set + * @since 1.5.0 + */ + public boolean hasMin() { + return this.min != DEFAULT_MINIMUM; + } + } @@ -257,6 +284,8 @@ public final class ShortArgument extends CommandArgument { private static final long serialVersionUID = -478674263339091032L; + private final ShortParser parser; + /** * Construct a new short parse exception * @@ -264,30 +293,43 @@ public final class ShortArgument extends CommandArgument { * @param min Minimum value * @param max Maximum value * @param commandContext Command context + * @deprecated use {@link #ShortParseException(String, ShortParser, CommandContext)} instead */ + @Deprecated public ShortParseException( final @NonNull String input, final short min, final short max, final @NonNull CommandContext commandContext ) { - super( - input, - min, - max, - ShortParser.class, - commandContext - ); + this(input, new ShortParser<>(min, max), commandContext); + } + + /** + * Create a new {@link ShortParseException}. + * + * @param input input string + * @param parser short parser + * @param commandContext command context + * @since 1.5.0 + */ + public ShortParseException( + final @NonNull String input, + final @NonNull ShortParser parser, + final @NonNull CommandContext commandContext + ) { + super(input, parser.min, parser.max, ShortParser.class, commandContext); + this.parser = parser; } @Override public boolean hasMin() { - return this.getMin().shortValue() != Short.MIN_VALUE; + return this.parser.hasMin(); } @Override public boolean hasMax() { - return this.getMax().shortValue() != Short.MAX_VALUE; + return this.parser.hasMax(); } @Override diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java index 0ff411ed..8dcf0229 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java @@ -37,6 +37,7 @@ import cloud.commandframework.arguments.standard.ByteArgument; import cloud.commandframework.arguments.standard.DoubleArgument; import cloud.commandframework.arguments.standard.FloatArgument; import cloud.commandframework.arguments.standard.IntegerArgument; +import cloud.commandframework.arguments.standard.LongArgument; import cloud.commandframework.arguments.standard.ShortArgument; import cloud.commandframework.arguments.standard.StringArgument; import cloud.commandframework.arguments.standard.StringArrayArgument; @@ -51,6 +52,7 @@ import com.mojang.brigadier.arguments.BoolArgumentType; import com.mojang.brigadier.arguments.DoubleArgumentType; import com.mojang.brigadier.arguments.FloatArgumentType; import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.LongArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.builder.LiteralArgumentBuilder; @@ -138,65 +140,66 @@ public final class CloudBrigadierManager { /* Map byte, short and int to IntegerArgumentType */ this.registerMapping(new TypeToken>() { }, builder -> builder.to(argument -> { - final boolean hasMin = argument.getMin() != Byte.MIN_VALUE; - final boolean hasMax = argument.getMax() != Byte.MAX_VALUE; - if (hasMin) { - return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); - } else if (hasMax) { - return IntegerArgumentType.integer(Byte.MIN_VALUE, argument.getMax()); - } else { - return IntegerArgumentType.integer(); - } + return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(argument -> { - final boolean hasMin = argument.getMin() != Short.MIN_VALUE; - final boolean hasMax = argument.getMax() != Short.MAX_VALUE; - if (hasMin) { - return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); - } else if (hasMax) { - return IntegerArgumentType.integer(Short.MIN_VALUE, argument.getMax()); - } else { - return IntegerArgumentType.integer(); - } + return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); })); this.registerMapping(new TypeToken>() { }, builder -> builder.to(argument -> { - final boolean hasMin = argument.getMin() != Integer.MIN_VALUE; - final boolean hasMax = argument.getMax() != Integer.MAX_VALUE; - if (hasMin) { - return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); - } else if (hasMax) { - return IntegerArgumentType.integer(Integer.MIN_VALUE, argument.getMax()); - } else { + if (!argument.hasMin() && !argument.hasMax()) { return IntegerArgumentType.integer(); } + if (argument.hasMin() && !argument.hasMax()) { + return IntegerArgumentType.integer(argument.getMin()); + } else if (!argument.hasMin()) { + // Brig uses Integer.MIN_VALUE and Integer.MAX_VALUE for default min/max + return IntegerArgumentType.integer(Integer.MIN_VALUE, argument.getMax()); + } + return IntegerArgumentType.integer(argument.getMin(), argument.getMax()); })); /* Map float to FloatArgumentType */ this.registerMapping(new TypeToken>() { }, builder -> builder.to(argument -> { - final boolean hasMin = argument.getMin() != Float.NEGATIVE_INFINITY; - final boolean hasMax = argument.getMax() != Float.POSITIVE_INFINITY; - if (hasMin) { - return FloatArgumentType.floatArg(argument.getMin(), argument.getMax()); - } else if (hasMax) { - return FloatArgumentType.floatArg(Float.NEGATIVE_INFINITY, argument.getMax()); - } else { + if (!argument.hasMin() && !argument.hasMax()) { return FloatArgumentType.floatArg(); } + if (argument.hasMin() && !argument.hasMax()) { + return FloatArgumentType.floatArg(argument.getMin()); + } else if (!argument.hasMin()) { + // Brig uses -Float.MAX_VALUE and Float.MAX_VALUE for default min/max + return FloatArgumentType.floatArg(-Float.MAX_VALUE, argument.getMax()); + } + return FloatArgumentType.floatArg(argument.getMin(), argument.getMax()); })); /* Map double to DoubleArgumentType */ this.registerMapping(new TypeToken>() { }, builder -> builder.to(argument -> { - final boolean hasMin = argument.getMin() != Double.NEGATIVE_INFINITY; - final boolean hasMax = argument.getMax() != Double.POSITIVE_INFINITY; - if (hasMin) { - return DoubleArgumentType.doubleArg(argument.getMin(), argument.getMax()); - } else if (hasMax) { - return DoubleArgumentType.doubleArg(Double.NEGATIVE_INFINITY, argument.getMax()); - } else { + if (!argument.hasMin() && !argument.hasMax()) { return DoubleArgumentType.doubleArg(); } + if (argument.hasMin() && !argument.hasMax()) { + return DoubleArgumentType.doubleArg(argument.getMin()); + } else if (!argument.hasMin()) { + // Brig uses -Double.MAX_VALUE and Double.MAX_VALUE for default min/max + return DoubleArgumentType.doubleArg(-Double.MAX_VALUE, argument.getMax()); + } + return DoubleArgumentType.doubleArg(argument.getMin(), argument.getMax()); + })); + /* Map long parser to LongArgumentType */ + this.registerMapping(new TypeToken>() { + }, builder -> builder.to(longParser -> { + if (!longParser.hasMin() && !longParser.hasMax()) { + return LongArgumentType.longArg(); + } + if (longParser.hasMin() && !longParser.hasMax()) { + return LongArgumentType.longArg(longParser.getMin()); + } else if (!longParser.hasMin()) { + // Brig uses Long.MIN_VALUE and Long.MAX_VALUE for default min/max + return LongArgumentType.longArg(Long.MIN_VALUE, longParser.getMax()); + } + return LongArgumentType.longArg(longParser.getMin(), longParser.getMax()); })); /* Map boolean to BoolArgumentType */ this.registerMapping(new TypeToken>() { @@ -267,31 +270,18 @@ public final class CloudBrigadierManager { * @since 1.2.0 */ public void setNativeNumberSuggestions(final boolean nativeNumberSuggestions) { - this.setNativeSuggestions( - new TypeToken>() { - }, - nativeNumberSuggestions - ); - this.setNativeSuggestions( - new TypeToken>() { - }, - nativeNumberSuggestions - ); - this.setNativeSuggestions( - new TypeToken>() { - }, - nativeNumberSuggestions - ); - this.setNativeSuggestions( - new TypeToken>() { - }, - nativeNumberSuggestions - ); - this.setNativeSuggestions( - new TypeToken>() { - }, - nativeNumberSuggestions - ); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); + this.setNativeSuggestions(new TypeToken>() { + }, nativeNumberSuggestions); } /** @@ -358,11 +348,13 @@ public final class CloudBrigadierManager { * * @param parserType The cloud argument parser type * @param configurer a callback that will configure the mapping attributes - * @param cloud argument parser type + * @param cloud argument parser type * @since 1.5.0 */ - public > void registerMapping(final @NonNull TypeToken parserType, - final Consumer> configurer) { + public > void registerMapping( + final @NonNull TypeToken parserType, + final Consumer> configurer + ) { final BrigadierMapping.BuilderImpl builder = new BrigadierMapping.BuilderImpl<>(); configurer.accept(builder); this.mappers.put(GenericTypeReflector.erase(parserType.getType()), builder.build()); diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/location/LocationCoordinateParser.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/location/LocationCoordinateParser.java index 8753eb06..c4618e65 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/location/LocationCoordinateParser.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/location/LocationCoordinateParser.java @@ -71,14 +71,14 @@ public final class LocationCoordinateParser implements ArgumentParser( + DoubleArgument.DoubleParser.DEFAULT_MINIMUM, + DoubleArgument.DoubleParser.DEFAULT_MAXIMUM + ), + commandContext + )); } inputQueue.remove();