From 95f903bb1fdc84a295f64e8ace43559c4a13a6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sat, 19 Sep 2020 23:23:28 +0200 Subject: [PATCH] Allow overriding of all argument suggestions --- .../commands/CommandTree.java | 10 +-- .../commands/arguments/CommandArgument.java | 67 ++++++++++++++++--- .../arguments/standard/BooleanArgument.java | 10 ++- .../arguments/standard/ByteArgument.java | 10 ++- .../arguments/standard/CharArgument.java | 11 ++- .../arguments/standard/DoubleArgument.java | 11 ++- .../arguments/standard/EnumArgument.java | 10 ++- .../arguments/standard/FloatArgument.java | 11 ++- .../arguments/standard/IntegerArgument.java | 10 ++- .../arguments/standard/LongArgument.java | 10 ++- .../arguments/standard/ShortArgument.java | 10 ++- .../arguments/standard/StringArgument.java | 3 +- .../commands/CommandSuggestionsTest.java | 12 ++++ .../bukkit/parsers/MaterialArgument.java | 8 ++- .../bukkit/parsers/WorldArgument.java | 9 ++- 15 files changed, 156 insertions(+), 46 deletions(-) diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/CommandTree.java b/cloud-core/src/main/java/com/intellectualsites/commands/CommandTree.java index 783bd8ac..406d84f3 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/CommandTree.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/CommandTree.java @@ -299,18 +299,18 @@ public final class CommandTree { return Collections.emptyList(); // return child.getValue().getParser().suggestions(commandContext, ""); } else if (child.isLeaf() && commandQueue.size() < 2) { - return child.getValue().getParser().suggestions(commandContext, commandQueue.peek()); + return child.getValue().getSuggestionsProvider().apply(commandContext, commandQueue.peek()); } else if (child.isLeaf()) { return Collections.emptyList(); } else if (commandQueue.peek().isEmpty()) { - return child.getValue().getParser().suggestions(commandContext, commandQueue.remove()); + return child.getValue().getSuggestionsProvider().apply(commandContext, commandQueue.remove()); } final ArgumentParseResult result = child.getValue().getParser().parse(commandContext, commandQueue); if (result.getParsedValue().isPresent()) { commandContext.store(child.getValue().getName(), result.getParsedValue().get()); return this.getSuggestions(commandContext, commandQueue, child); } else if (result.getFailure().isPresent()) { - return child.getValue().getParser().suggestions(commandContext, commandQueue.peek()); + return child.getValue().getSuggestionsProvider().apply(commandContext, commandQueue.peek()); } } } @@ -336,8 +336,8 @@ public final class CommandTree { if (argument.getValue() == null || this.isPermitted(commandContext.getSender(), argument) != null) { continue; } - suggestions.addAll( - argument.getValue().getParser().suggestions(commandContext, stringOrEmpty(commandQueue.peek()))); + suggestions.addAll(argument.getValue().getSuggestionsProvider() + .apply(commandContext, stringOrEmpty(commandQueue.peek()))); } return suggestions; } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/CommandArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/CommandArgument.java index ed40c1c2..eee67478 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/CommandArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/CommandArgument.java @@ -29,10 +29,13 @@ import com.intellectualsites.commands.CommandManager; import com.intellectualsites.commands.arguments.parser.ArgumentParseResult; import com.intellectualsites.commands.arguments.parser.ArgumentParser; import com.intellectualsites.commands.arguments.parser.ParserParameters; +import com.intellectualsites.commands.context.CommandContext; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import java.util.List; import java.util.Objects; +import java.util.function.BiFunction; import java.util.regex.Pattern; /** @@ -75,23 +78,29 @@ public class CommandArgument implements Comparable> * The type that is produces by the argument's parser */ private final Class valueType; + /** + * Suggestion provider + */ + private final BiFunction, String, List> suggestionsProvider; private Command owningCommand; /** * Construct a new command argument * - * @param required Whether or not the argument is required - * @param name The argument name - * @param parser The argument parser - * @param defaultValue Default value used when no value is provided by the command sender - * @param valueType Type produced by the parser + * @param required Whether or not the argument is required + * @param name The argument name + * @param parser The argument parser + * @param defaultValue Default value used when no value is provided by the command sender + * @param valueType Type produced by the parser + * @param suggestionsProvider Suggestions provider */ public CommandArgument(final boolean required, @Nonnull final String name, @Nonnull final ArgumentParser parser, @Nonnull final String defaultValue, - @Nonnull final Class valueType) { + @Nonnull final Class valueType, + @Nullable final BiFunction, String, List> suggestionsProvider) { this.required = required; this.name = Objects.requireNonNull(name, "Name may not be null"); if (!NAME_PATTERN.asPredicate().test(name)) { @@ -100,6 +109,9 @@ public class CommandArgument implements Comparable> this.parser = Objects.requireNonNull(parser, "Parser may not be null"); this.defaultValue = defaultValue; this.valueType = valueType; + this.suggestionsProvider = suggestionsProvider == null + ? buildDefaultSuggestionsProvider(this) + : suggestionsProvider; } /** @@ -114,7 +126,12 @@ public class CommandArgument implements Comparable> @Nonnull final String name, @Nonnull final ArgumentParser parser, @Nonnull final Class valueType) { - this(required, name, parser, "", valueType); + this(required, name, parser, "", valueType, null); + } + + private static BiFunction, String, List> buildDefaultSuggestionsProvider( + @Nonnull final CommandArgument argument) { + return (context, s) -> argument.getParser().suggestions(context, s); } /** @@ -190,6 +207,16 @@ public class CommandArgument implements Comparable> this.owningCommand = owningCommand; } + /** + * Get the argument suggestions provider + * + * @return Suggestions provider + */ + @Nonnull + public final BiFunction, String, List> getSuggestionsProvider() { + return this.suggestionsProvider; + } + @Override public final boolean equals(final Object o) { if (this == o) { @@ -269,6 +296,7 @@ public class CommandArgument implements Comparable> private boolean required = true; private ArgumentParser parser; private String defaultValue = ""; + private BiFunction, String, List> suggestionsProvider; protected Builder(@Nonnull final Class valueType, @Nonnull final String name) { @@ -348,6 +376,19 @@ public class CommandArgument implements Comparable> return this; } + /** + * Set the suggestions provider + * + * @param suggestionsProvider Suggestions provider + * @return Builder instance + */ + @Nonnull + public Builder withSuggestionsProvider( + @Nonnull final BiFunction, String, List> suggestionsProvider) { + this.suggestionsProvider = suggestionsProvider; + return this; + } + /** * Construct a command argument from the builder settings * @@ -363,7 +404,11 @@ public class CommandArgument implements Comparable> this.parser = (c, i) -> ArgumentParseResult .failure(new UnsupportedOperationException("No parser was specified")); } - return new CommandArgument<>(this.required, this.name, this.parser, this.defaultValue, this.valueType); + if (suggestionsProvider == null) { + suggestionsProvider = this.parser::suggestions; + } + return new CommandArgument<>(this.required, this.name, this.parser, + this.defaultValue, this.valueType, this.suggestionsProvider); } @Nonnull @@ -384,6 +429,12 @@ public class CommandArgument implements Comparable> protected final String getDefaultValue() { return this.defaultValue; } + + @Nonnull + protected final BiFunction, String, List> getSuggestionsProvider() { + return this.suggestionsProvider; + } + } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/BooleanArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/BooleanArgument.java index 98e8b3fe..6d9fb6b8 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/BooleanArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/BooleanArgument.java @@ -29,17 +29,20 @@ import com.intellectualsites.commands.arguments.parser.ArgumentParser; import com.intellectualsites.commands.context.CommandContext; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Arrays; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class BooleanArgument extends CommandArgument { private final boolean liberal; private BooleanArgument(final boolean required, @Nonnull final String name, - final boolean liberal, @Nonnull final String defaultValue) { - super(required, name, new BooleanParser<>(liberal), defaultValue, Boolean.class); + final boolean liberal, @Nonnull final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new BooleanParser<>(liberal), defaultValue, Boolean.class, suggestionsProvider); this.liberal = liberal; } @@ -130,7 +133,8 @@ public final class BooleanArgument extends CommandArgument { @Nonnull @Override public BooleanArgument build() { - return new BooleanArgument<>(this.isRequired(), this.getName(), this.liberal, this.getDefaultValue()); + return new BooleanArgument<>(this.isRequired(), this.getName(), this.liberal, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ByteArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ByteArgument.java index f25000d4..aa0f1627 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ByteArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ByteArgument.java @@ -30,8 +30,10 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class ByteArgument extends CommandArgument { @@ -40,8 +42,9 @@ public final class ByteArgument extends CommandArgument { private final byte max; private ByteArgument(final boolean required, @Nonnull final String name, final byte min, - final byte max, final String defaultValue) { - super(required, name, new ByteParser<>(min, max), defaultValue, Byte.class); + final byte max, final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new ByteParser<>(min, max), defaultValue, Byte.class, suggestionsProvider); this.min = min; this.max = max; } @@ -155,7 +158,8 @@ public final class ByteArgument extends CommandArgument { @Nonnull @Override public ByteArgument build() { - return new ByteArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new ByteArgument<>(this.isRequired(), this.getName(), this.min, this.max, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/CharArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/CharArgument.java index 4ed53742..82b0689d 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/CharArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/CharArgument.java @@ -29,14 +29,18 @@ import com.intellectualsites.commands.arguments.parser.ArgumentParser; import com.intellectualsites.commands.context.CommandContext; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class CharArgument extends CommandArgument { private CharArgument(final boolean required, @Nonnull final String name, - @Nonnull final String defaultValue) { - super(required, name, new CharacterParser<>(), defaultValue, Character.class); + @Nonnull final String defaultValue, @Nullable + final BiFunction, String, List> suggestionsProvider) { + super(required, name, new CharacterParser<>(), defaultValue, Character.class, suggestionsProvider); } /** @@ -104,7 +108,8 @@ public final class CharArgument extends CommandArgument { @Nonnull @Override public CharArgument build() { - return new CharArgument<>(this.isRequired(), this.getName(), this.getDefaultValue()); + return new CharArgument<>(this.isRequired(), this.getName(), + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/DoubleArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/DoubleArgument.java index 21ace85c..ea34fbec 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/DoubleArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/DoubleArgument.java @@ -30,7 +30,10 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class DoubleArgument extends CommandArgument { @@ -42,8 +45,9 @@ public final class DoubleArgument extends CommandArgument { @Nonnull final String name, final double min, final double max, - final String defaultValue) { - super(required, name, new DoubleParser<>(min, max), defaultValue, Double.class); + final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new DoubleParser<>(min, max), defaultValue, Double.class, suggestionsProvider); this.min = min; this.max = max; } @@ -157,7 +161,8 @@ public final class DoubleArgument extends CommandArgument { @Nonnull @Override public DoubleArgument build() { - return new DoubleArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new DoubleArgument<>(this.isRequired(), this.getName(), this.min, this.max, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/EnumArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/EnumArgument.java index 42144989..1c8a9b30 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/EnumArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/EnumArgument.java @@ -29,9 +29,11 @@ import com.intellectualsites.commands.arguments.parser.ArgumentParser; import com.intellectualsites.commands.context.CommandContext; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.EnumSet; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; import java.util.stream.Collectors; /** @@ -46,8 +48,9 @@ public class EnumArgument> extends CommandArgument { protected EnumArgument(@Nonnull final Class enumClass, final boolean required, @Nonnull final String name, - @Nonnull final String defaultValue) { - super(required, name, new EnumParser<>(enumClass), defaultValue, enumClass); + @Nonnull final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new EnumParser<>(enumClass), defaultValue, enumClass, suggestionsProvider); } /** @@ -124,7 +127,8 @@ public class EnumArgument> extends CommandArgument { @Nonnull @Override public CommandArgument build() { - return new EnumArgument<>(this.enumClass, this.isRequired(), this.getName(), this.getDefaultValue()); + return new EnumArgument<>(this.enumClass, this.isRequired(), this.getName(), + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/FloatArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/FloatArgument.java index eeab6f20..cf63831e 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/FloatArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/FloatArgument.java @@ -30,7 +30,10 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class FloatArgument extends CommandArgument { @@ -42,8 +45,9 @@ public final class FloatArgument extends CommandArgument { @Nonnull final String name, final float min, final float max, - final String defaultValue) { - super(required, name, new FloatParser<>(min, max), defaultValue, Float.class); + final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new FloatParser<>(min, max), defaultValue, Float.class, suggestionsProvider); this.min = min; this.max = max; } @@ -157,7 +161,8 @@ public final class FloatArgument extends CommandArgument { @Nonnull @Override public FloatArgument build() { - return new FloatArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new FloatArgument<>(this.isRequired(), this.getName(), this.min, this.max, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/IntegerArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/IntegerArgument.java index 25adae54..e332a919 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/IntegerArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/IntegerArgument.java @@ -30,10 +30,12 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -50,8 +52,9 @@ public final class IntegerArgument extends CommandArgument { @Nonnull final String name, final int min, final int max, - final String defaultValue) { - super(required, name, new IntegerParser<>(min, max), defaultValue, Integer.class); + final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new IntegerParser<>(min, max), defaultValue, Integer.class, suggestionsProvider); this.min = min; this.max = max; } @@ -165,7 +168,8 @@ public final class IntegerArgument extends CommandArgument { @Nonnull @Override public IntegerArgument build() { - return new IntegerArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new IntegerArgument<>(this.isRequired(), this.getName(), this.min, this.max, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/LongArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/LongArgument.java index 65470ee6..187e24dd 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/LongArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/LongArgument.java @@ -30,8 +30,10 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class LongArgument extends CommandArgument { @@ -43,8 +45,9 @@ public final class LongArgument extends CommandArgument { @Nonnull final String name, final long min, final long max, - final String defaultValue) { - super(required, name, new LongParser<>(min, max), defaultValue, Long.class); + final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new LongParser<>(min, max), defaultValue, Long.class, suggestionsProvider); this.min = min; this.max = max; } @@ -158,7 +161,8 @@ public final class LongArgument extends CommandArgument { @Nonnull @Override public LongArgument build() { - return new LongArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new LongArgument<>(this.isRequired(), this.getName(), this.min, + this.max, this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ShortArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ShortArgument.java index 4e080c70..95512378 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ShortArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/ShortArgument.java @@ -30,8 +30,10 @@ import com.intellectualsites.commands.context.CommandContext; import com.intellectualsites.commands.exceptions.parsing.NumberParseException; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; @SuppressWarnings("unused") public final class ShortArgument extends CommandArgument { @@ -43,8 +45,9 @@ public final class ShortArgument extends CommandArgument { @Nonnull final String name, final short min, final short max, - final String defaultValue) { - super(required, name, new ShortParser<>(min, max), defaultValue, Short.class); + final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new ShortParser<>(min, max), defaultValue, Short.class, suggestionsProvider); this.min = min; this.max = max; } @@ -158,7 +161,8 @@ public final class ShortArgument extends CommandArgument { @Nonnull @Override public ShortArgument build() { - return new ShortArgument<>(this.isRequired(), this.getName(), this.min, this.max, this.getDefaultValue()); + return new ShortArgument<>(this.isRequired(), this.getName(), this.min, this.max, + this.getDefaultValue(), this.getSuggestionsProvider()); } } diff --git a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/StringArgument.java b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/StringArgument.java index 7327fed1..45d0a712 100644 --- a/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/StringArgument.java +++ b/cloud-core/src/main/java/com/intellectualsites/commands/arguments/standard/StringArgument.java @@ -45,7 +45,8 @@ public final class StringArgument extends CommandArgument { @Nonnull final StringMode stringMode, @Nonnull final String defaultValue, @Nonnull final BiFunction, String, List> suggestionsProvider) { - super(required, name, new StringParser<>(stringMode, suggestionsProvider), defaultValue, String.class); + super(required, name, new StringParser<>(stringMode, suggestionsProvider), + defaultValue, String.class, suggestionsProvider); this.stringMode = stringMode; } diff --git a/cloud-core/src/test/java/com/intellectualsites/commands/CommandSuggestionsTest.java b/cloud-core/src/test/java/com/intellectualsites/commands/CommandSuggestionsTest.java index b1708c04..89814bf0 100644 --- a/cloud-core/src/test/java/com/intellectualsites/commands/CommandSuggestionsTest.java +++ b/cloud-core/src/test/java/com/intellectualsites/commands/CommandSuggestionsTest.java @@ -58,6 +58,11 @@ public class CommandSuggestionsTest { .argument(IntegerArgument.newBuilder("num") .withMin(1).withMax(95).asOptional().build()) .build()); + manager.command(manager.commandBuilder("test") + .literal("alt") + .argument(IntegerArgument.newBuilder("num") + .withSuggestionsProvider((c, s) -> Arrays.asList("3", "33", "333")).build()) + .build()); } @Test @@ -106,6 +111,13 @@ public class CommandSuggestionsTest { Assertions.assertEquals(Arrays.asList("9", "90", "91", "92", "93", "94", "95"), suggestions3); } + @Test + void testAltered() { + final String input = "test alt "; + final List suggestions = manager.suggest(new TestCommandSender(), input); + Assertions.assertEquals(Arrays.asList("3", "33", "333"), suggestions); + } + public enum TestEnum { FOO, diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/MaterialArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/MaterialArgument.java index 85571f60..cd6e84de 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/MaterialArgument.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/MaterialArgument.java @@ -30,8 +30,11 @@ import com.intellectualsites.commands.context.CommandContext; import org.bukkit.Material; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.EnumSet; +import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; import java.util.stream.Collectors; /** @@ -43,8 +46,9 @@ public class MaterialArgument extends CommandArgument { protected MaterialArgument(final boolean required, @Nonnull final String name, - @Nonnull final String defaultValue) { - super(required, name, new MaterialParser<>(), defaultValue, Material.class); + @Nonnull final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new MaterialParser<>(), defaultValue, Material.class, suggestionsProvider); } /** diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/WorldArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/WorldArgument.java index e85a54b8..8c6e5e33 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/WorldArgument.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/com/intellectualsites/commands/bukkit/parsers/WorldArgument.java @@ -31,8 +31,10 @@ import org.bukkit.Bukkit; import org.bukkit.World; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.List; import java.util.Queue; +import java.util.function.BiFunction; import java.util.stream.Collectors; /** @@ -44,8 +46,9 @@ public class WorldArgument extends CommandArgument { protected WorldArgument(final boolean required, @Nonnull final String name, - @Nonnull final String defaultValue) { - super(required, name, new WorldParser<>(), defaultValue, World.class); + @Nonnull final String defaultValue, + @Nullable final BiFunction, String, List> suggestionsProvider) { + super(required, name, new WorldParser<>(), defaultValue, World.class, suggestionsProvider); } /** @@ -108,7 +111,7 @@ public class WorldArgument extends CommandArgument { @Nonnull @Override public CommandArgument build() { - return new WorldArgument<>(this.isRequired(), this.getName(), this.getDefaultValue()); + return new WorldArgument<>(this.isRequired(), this.getName(), this.getDefaultValue(), this.getSuggestionsProvider()); } }