From c67cc35cf6a0ec457325684321eacde49c019f53 Mon Sep 17 00:00:00 2001 From: jmp Date: Fri, 16 Oct 2020 11:06:45 -0700 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Add=20captions=20for=20Bukkit=20?= =?UTF-8?q?entity=20selector=20arguments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/BukkitCaptionKeys.java | 23 ++++++++ .../bukkit/BukkitCaptionRegistry.java | 50 +++++++++++++++-- .../MultipleEntitySelectorArgument.java | 15 ++++- .../MultiplePlayerSelectorArgument.java | 14 ++++- .../selector/SelectorParseException.java | 55 +++++++++++++++++-- .../SingleEntitySelectorArgument.java | 23 ++++++-- .../SinglePlayerSelectorArgument.java | 22 ++++++-- 7 files changed, 178 insertions(+), 24 deletions(-) diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionKeys.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionKeys.java index 6b3d61ed..9eeff4ca 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionKeys.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionKeys.java @@ -57,6 +57,29 @@ public final class BukkitCaptionKeys { * Variables: {input} */ public static final Caption ARGUMENT_PARSE_FAILURE_WORLD = of("argument.parse.failure.world"); + /** + * Variables: {input} + */ + public static final Caption ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED = of("argument.parse.failure.selector.malformed"); + /** + * Variables: None + */ + public static final Caption ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED = of("argument.parse.failure.selector.unsupported"); + /** + * Variables: None + */ + public static final Caption ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS = of( + "argument.parse.failure.selector.too_many_players"); + /** + * Variables: None + */ + public static final Caption ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES = of( + "argument.parse.failure.selector.too_many_entities"); + /** + * Variables: None + */ + public static final Caption ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER = of( + "argument.parse.failure.selector.non_player_in_player_selector"); private BukkitCaptionKeys() { } diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionRegistry.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionRegistry.java index 60197826..1148b9b5 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionRegistry.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCaptionRegistry.java @@ -37,21 +37,43 @@ public class BukkitCaptionRegistry extends SimpleCaptionRegistry { */ public static final String ARGUMENT_PARSE_FAILURE_ENCHANTMENT = "'{input}' is not a valid enchantment"; /** - * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_ENCHANTMENT} + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_MATERIAL} */ public static final String ARGUMENT_PARSE_FAILURE_MATERIAL = "'{input}' is not a valid material name"; /** - * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_ENCHANTMENT} + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_OFFLINEPLAYER} */ public static final String ARGUMENT_PARSE_FAILURE_OFFLINEPLAYER = "No player found for input '{input}'"; /** - * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_ENCHANTMENT} + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_PLAYER} */ public static final String ARGUMENT_PARSE_FAILURE_PLAYER = "No player found for input '{input}'"; /** - * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_ENCHANTMENT} + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_WORLD} */ public static final String ARGUMENT_PARSE_FAILURE_WORLD = "'{input}' is not a valid Minecraft world"; + /** + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED} + */ + public static final String ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED = "Selector '{input}' is malformed."; + /** + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED} + */ + public static final String ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED = + "Entity selector argument type not supported below Minecraft 1.13."; + /** + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS} + */ + public static final String ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS = "More than 1 player selected in single player selector"; + /** + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES} + */ + public static final String ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES = "More than 1 entity selected in single entity selector."; + /** + * Default caption for {@link BukkitCaptionKeys#ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER} + */ + public static final String ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER = "Non-player(s) selected in player selector."; + protected BukkitCaptionRegistry() { super(); @@ -75,6 +97,26 @@ public class BukkitCaptionRegistry extends SimpleCaptionRegistry { BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_WORLD, (caption, sender) -> ARGUMENT_PARSE_FAILURE_WORLD ); + this.registerMessageFactory( + BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED + ); + this.registerMessageFactory( + BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED + ); + this.registerMessageFactory( + BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS + ); + this.registerMessageFactory( + BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES + ); + this.registerMessageFactory( + BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER, + (caption, sender) -> ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER + ); } } diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/MultipleEntitySelectorArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/MultipleEntitySelectorArgument.java index 716ebb9b..bc1eedaf 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/MultipleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/MultipleEntitySelectorArgument.java @@ -132,8 +132,12 @@ public final class MultipleEntitySelectorArgument extends CommandArgument>get("CloudBukkitCapabilities").contains( CloudBukkitCapabilities.BRIGADIER)) { - return ArgumentParseResult.failure( - new IllegalArgumentException("Entity selector argument type not supported below Minecraft 1.13.")); + return ArgumentParseResult.failure(new SelectorParseException( + "", + commandContext, + SelectorParseException.FailureReason.UNSUPPORTED_VERSION, + MultipleEntitySelectorParser.class + )); } final String input = inputQueue.peek(); if (input == null) { @@ -145,7 +149,12 @@ public final class MultipleEntitySelectorArgument extends CommandArgument extends CommandArgument context, + final @NonNull FailureReason reason, + final @NonNull Class parser + ) { + super( + parser, + context, + reason.getCaption(), + CaptionVariable.of("input", input) + ); this.input = input; } @@ -50,9 +69,33 @@ public final class SelectorParseException extends IllegalArgumentException { return input; } - @Override - public String getMessage() { - return String.format("Selector '%s' is malformed.", input); + /** + * Reasons for which selector parsing may fail + */ + public enum FailureReason { + + UNSUPPORTED_VERSION(BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_UNSUPPORTED), + MALFORMED_SELECTOR(BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_MALFORMED), + TOO_MANY_PLAYERS(BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_PLAYERS), + TOO_MANY_ENTITIES(BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_TOO_MANY_ENTITIES), + NON_PLAYER_IN_PLAYER_SELECTOR(BukkitCaptionKeys.ARGUMENT_PARSE_FAILURE_SELECTOR_NON_PLAYER); + + + private final Caption caption; + + FailureReason(final @NonNull Caption caption) { + this.caption = caption; + } + + /** + * Get the caption used for this failure reason + * + * @return The caption + */ + public @NonNull Caption getCaption() { + return this.caption; + } + } } diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SingleEntitySelectorArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SingleEntitySelectorArgument.java index ff80fdd7..2312e0d6 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SingleEntitySelectorArgument.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SingleEntitySelectorArgument.java @@ -130,8 +130,12 @@ public final class SingleEntitySelectorArgument extends CommandArgument>get("CloudBukkitCapabilities").contains( CloudBukkitCapabilities.BRIGADIER)) { - return ArgumentParseResult.failure( - new IllegalArgumentException("Entity selector argument type not supported below Minecraft 1.13.")); + return ArgumentParseResult.failure(new SelectorParseException( + "", + commandContext, + SelectorParseException.FailureReason.UNSUPPORTED_VERSION, + SingleEntitySelectorParser.class + )); } final String input = inputQueue.peek(); if (input == null) { @@ -143,12 +147,21 @@ public final class SingleEntitySelectorArgument extends CommandArgument 1) { - return ArgumentParseResult.failure( - new IllegalArgumentException("More than 1 entity selected in single entity selector.")); + return ArgumentParseResult.failure(new SelectorParseException( + input, + commandContext, + SelectorParseException.FailureReason.TOO_MANY_ENTITIES, + SingleEntitySelectorParser.class + )); } return ArgumentParseResult.success(new SingleEntitySelector(input, entities)); diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SinglePlayerSelectorArgument.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SinglePlayerSelectorArgument.java index 391aa027..7a3b4434 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SinglePlayerSelectorArgument.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/parsers/selector/SinglePlayerSelectorArgument.java @@ -153,17 +153,31 @@ public final class SinglePlayerSelectorArgument extends CommandArgument 1) { - return ArgumentParseResult.failure( - new IllegalArgumentException("More than 1 player selected in single player selector")); + return ArgumentParseResult.failure(new SelectorParseException( + input, + commandContext, + SelectorParseException.FailureReason.TOO_MANY_PLAYERS, + SinglePlayerSelectorParser.class + )); } return ArgumentParseResult.success(new SinglePlayerSelector(input, entities));