✨ Prevent command arguments from being used in multiple commands
Also get rid of some random annoying warnings.
This commit is contained in:
parent
b564ecf60d
commit
a4544a8550
5 changed files with 44 additions and 2 deletions
|
|
@ -384,6 +384,11 @@ public class Command<C> {
|
||||||
*/
|
*/
|
||||||
public <T> @NonNull Builder<C> argument(final @NonNull CommandArgument<C, T> argument,
|
public <T> @NonNull Builder<C> argument(final @NonNull CommandArgument<C, T> argument,
|
||||||
final @NonNull Description description) {
|
final @NonNull Description description) {
|
||||||
|
if (argument.isArgumentRegistered()) {
|
||||||
|
throw new IllegalArgumentException("The provided argument has already been associated with a command."
|
||||||
|
+ " Use CommandArgument#copy to create a copy of the argument.");
|
||||||
|
}
|
||||||
|
argument.setArgumentRegistered();
|
||||||
final Map<CommandArgument<C, ?>, Description> commandArgumentMap = new LinkedHashMap<>(this.commandArguments);
|
final Map<CommandArgument<C, ?>, Description> commandArgumentMap = new LinkedHashMap<>(this.commandArguments);
|
||||||
commandArgumentMap.put(argument, description);
|
commandArgumentMap.put(argument, description);
|
||||||
return new Builder<>(this.commandManager,
|
return new Builder<>(this.commandManager,
|
||||||
|
|
|
||||||
|
|
@ -82,6 +82,10 @@ public class CommandArgument<C, T> implements Comparable<CommandArgument<?, ?>>
|
||||||
* Suggestion provider
|
* Suggestion provider
|
||||||
*/
|
*/
|
||||||
private final BiFunction<CommandContext<C>, String, List<String>> suggestionsProvider;
|
private final BiFunction<CommandContext<C>, String, List<String>> suggestionsProvider;
|
||||||
|
/**
|
||||||
|
* Whether or not the argument has been used before
|
||||||
|
*/
|
||||||
|
private boolean argumentRegistered = false;
|
||||||
|
|
||||||
private Command<C> owningCommand;
|
private Command<C> owningCommand;
|
||||||
|
|
||||||
|
|
@ -328,6 +332,22 @@ public class CommandArgument<C, T> implements Comparable<CommandArgument<?, ?>>
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether or not the argument has been used in a command
|
||||||
|
*
|
||||||
|
* @return {@code true} if the argument has been used in a command, else {@code false}
|
||||||
|
*/
|
||||||
|
public boolean isArgumentRegistered() {
|
||||||
|
return this.argumentRegistered;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicate that the argument has been associated with a command
|
||||||
|
*/
|
||||||
|
public void setArgumentRegistered() {
|
||||||
|
this.argumentRegistered = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mutable builder for {@link CommandArgument} instances
|
* Mutable builder for {@link CommandArgument} instances
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@
|
||||||
//
|
//
|
||||||
package cloud.commandframework;
|
package cloud.commandframework;
|
||||||
|
|
||||||
|
import cloud.commandframework.arguments.CommandArgument;
|
||||||
import cloud.commandframework.arguments.compound.ArgumentPair;
|
import cloud.commandframework.arguments.compound.ArgumentPair;
|
||||||
import cloud.commandframework.arguments.standard.IntegerArgument;
|
import cloud.commandframework.arguments.standard.IntegerArgument;
|
||||||
import cloud.commandframework.arguments.standard.StringArgument;
|
import cloud.commandframework.arguments.standard.StringArgument;
|
||||||
|
|
@ -213,6 +214,15 @@ class CommandTreeTest {
|
||||||
manager.executeCommand(new TestCommandSender(), "flags --num 500");
|
manager.executeCommand(new TestCommandSender(), "flags --num 500");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testDuplicateArgument() {
|
||||||
|
final CommandArgument<TestCommandSender, String> argument = StringArgument.of("test");
|
||||||
|
manager.command(manager.commandBuilder("one").argument(argument));
|
||||||
|
Assertions.assertThrows(IllegalArgumentException.class, () ->
|
||||||
|
manager.command(manager.commandBuilder("two").argument(argument)));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static final class SpecificCommandSender extends TestCommandSender {
|
public static final class SpecificCommandSender extends TestCommandSender {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
|
|
||||||
private final Map<Class<?>, cloud.commandframework.types.tuples.Pair<Function<? extends ArgumentParser<C, ?>,
|
private final Map<Class<?>, cloud.commandframework.types.tuples.Pair<Function<? extends ArgumentParser<C, ?>,
|
||||||
? extends ArgumentType<?>>, Boolean>> mappers;
|
? extends ArgumentType<?>>, Boolean>> mappers;
|
||||||
private final Map<Class<?>, Supplier<ArgumentType<?>>> defaultArgumentTypeSuppliers;
|
private final Map<@NonNull Class<?>, @NonNull Supplier<@Nullable ArgumentType<?>>> defaultArgumentTypeSuppliers;
|
||||||
private final Supplier<CommandContext<C>> dummyContextProvider;
|
private final Supplier<CommandContext<C>> dummyContextProvider;
|
||||||
private final CommandManager<C> commandManager;
|
private final CommandManager<C> commandManager;
|
||||||
|
|
||||||
|
|
@ -214,7 +214,7 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
* @param supplier Supplier that supplies the argument type
|
* @param supplier Supplier that supplies the argument type
|
||||||
*/
|
*/
|
||||||
public void registerDefaultArgumentTypeSupplier(final @NonNull Class<?> clazz,
|
public void registerDefaultArgumentTypeSupplier(final @NonNull Class<?> clazz,
|
||||||
final @NonNull Supplier<@NonNull ArgumentType<?>> supplier) {
|
final @NonNull Supplier<@Nullable ArgumentType<?>> supplier) {
|
||||||
this.defaultArgumentTypeSuppliers.put(clazz, supplier);
|
this.defaultArgumentTypeSuppliers.put(clazz, supplier);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -238,7 +238,13 @@ public final class CloudBrigadierManager<C, S> {
|
||||||
final @NonNull ArgumentParser<C, T> argument) {
|
final @NonNull ArgumentParser<C, T> argument) {
|
||||||
final Supplier<ArgumentType<?>> argumentTypeSupplier = this.defaultArgumentTypeSuppliers
|
final Supplier<ArgumentType<?>> argumentTypeSupplier = this.defaultArgumentTypeSuppliers
|
||||||
.get(GenericTypeReflector.erase(clazz.getType()));
|
.get(GenericTypeReflector.erase(clazz.getType()));
|
||||||
|
@Nullable final ArgumentType<?> defaultType;
|
||||||
if (argumentTypeSupplier != null) {
|
if (argumentTypeSupplier != null) {
|
||||||
|
defaultType = argumentTypeSupplier.get();
|
||||||
|
} else {
|
||||||
|
defaultType = null;
|
||||||
|
}
|
||||||
|
if (defaultType != null) {
|
||||||
return new Pair<>(argumentTypeSupplier.get(), true);
|
return new Pair<>(argumentTypeSupplier.get(), true);
|
||||||
}
|
}
|
||||||
return new Pair<>(StringArgumentType.string(), false);
|
return new Pair<>(StringArgumentType.string(), false);
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,7 @@ class PaperBrigadierListener<C> implements Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler
|
@EventHandler
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
public void onCommandRegister(@Nonnull final CommandRegisteredEvent<BukkitBrigadierCommandSource> event) {
|
public void onCommandRegister(@Nonnull final CommandRegisteredEvent<BukkitBrigadierCommandSource> event) {
|
||||||
if (!(event.getCommand() instanceof PluginIdentifiableCommand)) {
|
if (!(event.getCommand() instanceof PluginIdentifiableCommand)) {
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue