From 9d47a7c82d9200ff60c45842fa3cf76572f75f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Thu, 1 Oct 2020 13:24:15 +0200 Subject: [PATCH] :art: Change (improve) command context semantics --- .../MethodCommandExecutionHandler.java | 4 ++-- .../cloud/commandframework/CommandManager.java | 4 ++-- .../context/CommandContext.java | 15 +++++++++------ .../CommandPreProcessorTest.java | 6 +++--- .../commandframework/CommandTreeTest.java | 6 +++--- .../arguments/standard/StringArgumentTest.java | 8 ++++---- .../jline/JLineCommandManager.java | 2 +- .../cloud/commandframework/BukkitTest.java | 18 +++++++++--------- 8 files changed, 33 insertions(+), 30 deletions(-) diff --git a/cloud-annotations/src/main/java/cloud/commandframework/annotations/MethodCommandExecutionHandler.java b/cloud-annotations/src/main/java/cloud/commandframework/annotations/MethodCommandExecutionHandler.java index 31a5f040..7c034627 100644 --- a/cloud-annotations/src/main/java/cloud/commandframework/annotations/MethodCommandExecutionHandler.java +++ b/cloud-annotations/src/main/java/cloud/commandframework/annotations/MethodCommandExecutionHandler.java @@ -62,9 +62,9 @@ class MethodCommandExecutionHandler implements CommandExecutionHandler { final Argument argument = parameter.getAnnotation(Argument.class); final CommandArgument commandArgument = this.commandArguments.get(argument.value()); if (commandArgument.isRequired()) { - arguments.add(commandContext.getRequired(argument.value())); + arguments.add(commandContext.get(argument.value())); } else { - final Object optional = commandContext.get(argument.value()).orElse(null); + final Object optional = commandContext.getOptional(argument.value()).orElse(null); arguments.add(optional); } } else { diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java index 79f51161..a370fcb3 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java @@ -411,7 +411,7 @@ public abstract class CommandManager { .through(new TypeToken>() { }) .getResult(); - return context.get(AcceptingCommandPreprocessor.PROCESSED_INDICATOR_KEY).orElse("").isEmpty() + return context.getOptional(AcceptingCommandPreprocessor.PROCESSED_INDICATOR_KEY).orElse("").isEmpty() ? State.REJECTED : State.ACCEPTED; } @@ -430,7 +430,7 @@ public abstract class CommandManager { .through(new TypeToken>() { }) .getResult(); - return context.get(AcceptingCommandPostprocessor.PROCESSED_INDICATOR_KEY).orElse("").isEmpty() + return context.getOptional(AcceptingCommandPostprocessor.PROCESSED_INDICATOR_KEY).orElse("").isEmpty() ? State.REJECTED : State.ACCEPTED; } diff --git a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java index 1fb478ed..e92798d9 100644 --- a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java @@ -83,7 +83,8 @@ public final class CommandContext { } /** - * Store a value in the context map + * Store a value in the context map. This will overwrite any existing + * value stored with the same key * * @param key Key * @param value Value @@ -94,13 +95,14 @@ public final class CommandContext { } /** - * Get a value from its key + * Get a value from its key. Will return {@link Optional#empty()} + * if no value is stored with the given key * * @param key Key * @param Value type * @return Value */ - public @NonNull Optional get(@NonNull final String key) { + public @NonNull Optional getOptional(@NonNull final String key) { final Object value = this.internalStorage.get(key); if (value != null) { @SuppressWarnings("ALL") final T castedValue = (T) value; @@ -111,7 +113,8 @@ public final class CommandContext { } /** - * Get a required argument from the context + * Get a required argument from the context. This will thrown an exception + * if there's no value associated with the given key * * @param key Argument key * @param Argument type @@ -119,7 +122,7 @@ public final class CommandContext { * @throws NullPointerException If no such argument is stored */ @SuppressWarnings("unchecked") - public @NonNull T getRequired(@NonNull final String key) { + public @NonNull T get(@NonNull final String key) { final Object value = this.internalStorage.get(key); if (value == null) { throw new NullPointerException("No such object stored in the context: " + key); @@ -137,7 +140,7 @@ public final class CommandContext { */ public @NonNull T getOrDefault(@NonNull final String key, @NonNull final T defaultValue) { - return this.get(key).orElse(defaultValue); + return this.getOptional(key).orElse(defaultValue); } /** diff --git a/cloud-core/src/test/java/cloud/commandframework/CommandPreProcessorTest.java b/cloud-core/src/test/java/cloud/commandframework/CommandPreProcessorTest.java index 2d2b39be..026be94a 100644 --- a/cloud-core/src/test/java/cloud/commandframework/CommandPreProcessorTest.java +++ b/cloud-core/src/test/java/cloud/commandframework/CommandPreProcessorTest.java @@ -43,10 +43,10 @@ public class CommandPreProcessorTest { .argument(EnumArgument.of(SampleEnum.class, "enum")) .handler( commandContext -> System.out.printf("enum = %s | integer = %d\n", - commandContext.get( + commandContext.getOptional( "enum").orElse( SampleEnum.VALUE1), - commandContext.get( + commandContext.getOptional( "int").orElseThrow( () -> new NullPointerException( "int")))) @@ -57,7 +57,7 @@ public class CommandPreProcessorTest { @Test void testPreprocessing() { Assertions.assertEquals(10, manager.executeCommand(new TestCommandSender(), "10 test value1") - .join().getCommandContext().get("int").orElse(0)); + .join().getCommandContext().getOptional("int").orElse(0)); manager.executeCommand(new TestCommandSender(), "aa test value1").join(); } diff --git a/cloud-core/src/test/java/cloud/commandframework/CommandTreeTest.java b/cloud-core/src/test/java/cloud/commandframework/CommandTreeTest.java index 9a50dfb9..d1b5869e 100644 --- a/cloud-core/src/test/java/cloud/commandframework/CommandTreeTest.java +++ b/cloud-core/src/test/java/cloud/commandframework/CommandTreeTest.java @@ -90,7 +90,7 @@ class CommandTreeTest { Pair.of(Integer.class, Integer.class)) .simple()) .handler(c -> { - final Pair pair = c.getRequired("pos"); + final Pair pair = c.get("pos"); System.out.printf("X: %d | Y: %d\n", pair.getFirst(), pair.getSecond()); }) .build()); @@ -101,7 +101,7 @@ class CommandTreeTest { pair -> new Vector2(pair.getFirst(), pair.getSecond())) ) .handler(c -> { - final Vector2 vector2 = c.getRequired("vec"); + final Vector2 vector2 = c.get("vec"); System.out.printf("X: %f | Y: %f\n", vector2.getX(), vector2.getY()); }) .build()); @@ -155,7 +155,7 @@ class CommandTreeTest { manager.commandBuilder("default") .argument(manager.argumentBuilder(Integer.class, "int").build()) .handler(context -> { - final int number = context.getRequired("int"); + final int number = context.get("int"); System.out.printf("Supplied number is: %d\n", number); }) .build() diff --git a/cloud-core/src/test/java/cloud/commandframework/arguments/standard/StringArgumentTest.java b/cloud-core/src/test/java/cloud/commandframework/arguments/standard/StringArgumentTest.java index 284fe02f..962b273f 100644 --- a/cloud-core/src/test/java/cloud/commandframework/arguments/standard/StringArgumentTest.java +++ b/cloud-core/src/test/java/cloud/commandframework/arguments/standard/StringArgumentTest.java @@ -42,8 +42,8 @@ class StringArgumentTest { .argument(StringArgument.of("message1", StringArgument.StringMode.QUOTED)) .argument(StringArgument.of("message2")) .handler(c -> { - final String message1 = c.getRequired("message1"); - final String message2 = c.getRequired("message2"); + final String message1 = c.get("message1"); + final String message2 = c.get("message2"); storage[0] = message1; storage[1] = message2; }) @@ -51,14 +51,14 @@ class StringArgumentTest { manager.command(manager.commandBuilder("single") .argument(StringArgument.of("message")) .handler(c -> { - final String message = c.getRequired("message"); + final String message = c.get("message"); storage[0] = message; }) .build()); manager.command(manager.commandBuilder("greedy") .argument(StringArgument.of("message", StringArgument.StringMode.GREEDY)) .handler(c -> { - final String message = c.getRequired("message"); + final String message = c.get("message"); storage[0] = message; }) .build()); diff --git a/cloud-jline/src/main/java/cloud/commandframework/jline/JLineCommandManager.java b/cloud-jline/src/main/java/cloud/commandframework/jline/JLineCommandManager.java index 441e6430..19d300ac 100644 --- a/cloud-jline/src/main/java/cloud/commandframework/jline/JLineCommandManager.java +++ b/cloud-jline/src/main/java/cloud/commandframework/jline/JLineCommandManager.java @@ -95,7 +95,7 @@ public class JLineCommandManager extends CommandManager impl return ArgumentParseResult.success( stringBuilder.toString()); })).build()) - .handler(commandContext -> commandContext.get("string") + .handler(commandContext -> commandContext.getOptional("string") .ifPresent( System.out::println)) .build()) diff --git a/cloud-minecraft/cloud-bukkit-test/src/main/java/cloud/commandframework/BukkitTest.java b/cloud-minecraft/cloud-bukkit-test/src/main/java/cloud/commandframework/BukkitTest.java index c6100fde..5b82716a 100644 --- a/cloud-minecraft/cloud-bukkit-test/src/main/java/cloud/commandframework/BukkitTest.java +++ b/cloud-minecraft/cloud-bukkit-test/src/main/java/cloud/commandframework/BukkitTest.java @@ -136,7 +136,7 @@ public final class BukkitTest extends JavaPlugin { return suggestions; }).build()) .handler(c -> ((Player) c.getSender()) - .setGameMode(c.get("gamemode") + .setGameMode(c.getOptional("gamemode") .orElse(GameMode.SURVIVAL))) .build()) .command(mgr.commandBuilder("kenny", "k") @@ -147,7 +147,7 @@ public final class BukkitTest extends JavaPlugin { .handler(context -> { context.getSender().sendMessage(String.format( "Kenny sux %d%%", - context.get("perc").orElse(PERC_MIN) + context.getOptional("perc").orElse(PERC_MIN) )); }) .build()) @@ -168,15 +168,15 @@ public final class BukkitTest extends JavaPlugin { } }).build()) .handler(c -> c.getSender() - .sendMessage(String.format("UUID: %s\n", c.get("uuid").orElse(null)))) + .sendMessage(String.format("UUID: %s\n", c.getOptional("uuid").orElse(null)))) .build()) .command(mgr.commandBuilder("give") .withSenderType(Player.class) .argument(EnumArgument.of(Material.class, "material")) .argument(IntegerArgument.of("amount")) .handler(c -> { - final Material material = c.getRequired("material"); - final int amount = c.getRequired("amount"); + final Material material = c.get("material"); + final int amount = c.get("amount"); final ItemStack itemStack = new ItemStack(material, amount); ((Player) c.getSender()).getInventory().addItem(itemStack); c.getSender().sendMessage("You've been given stuff, bro."); @@ -187,7 +187,7 @@ public final class BukkitTest extends JavaPlugin { .build()) .argument(WorldArgument.of("world")) .handler(c -> { - final World world = c.getRequired("world"); + final World world = c.get("world"); ((Player) c.getSender()).teleport(world.getSpawnLocation()); c.getSender().sendMessage("Teleported."); }) @@ -213,7 +213,7 @@ public final class BukkitTest extends JavaPlugin { .argument(StringArgument.newBuilder("query").greedy() .asOptionalWithDefault("") .build(), Description.of("Help Query")) - .handler(c -> minecraftHelp.queryCommands(c.get("query").orElse(""), + .handler(c -> minecraftHelp.queryCommands(c.getOptional("query").orElse(""), c.getSender())).build()); this.registerTeleportCommand(mgr); mgr.registerExceptionHandler(InvalidSyntaxException.class, (c, e) -> e.printStackTrace()); @@ -236,8 +236,8 @@ public final class BukkitTest extends JavaPlugin { .handler(context -> { context.getSender().sendMessage(ChatColor.GOLD + "Teleporting!"); Bukkit.getScheduler().runTask(this, () -> { - final World world = context.getRequired("world"); - final Vector vector = context.getRequired("coords"); + final World world = context.get("world"); + final Vector vector = context.get("coords"); ((Player) context.getSender()).teleport(vector.toLocation(world)); }); })