From 0e4168ba458fb08b5c82d693cee9d8c90415bc10 Mon Sep 17 00:00:00 2001 From: LeoDog896 Date: Tue, 6 Apr 2021 22:07:38 -0400 Subject: [PATCH 1/4] Add ArgumentMap --- .../command/builder/ArgumentMapper.java | 10 ++++ .../command/builder/arguments/Argument.java | 9 ++-- .../builder/arguments/ArgumentMap.java | 34 +++++++++++++ .../demo/commands/UnloadExtensionCommand.java | 48 +++++++++---------- 4 files changed, 73 insertions(+), 28 deletions(-) create mode 100644 src/main/java/net/minestom/server/command/builder/ArgumentMapper.java create mode 100644 src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java diff --git a/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java b/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java new file mode 100644 index 000000000..73efefab7 --- /dev/null +++ b/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java @@ -0,0 +1,10 @@ +package net.minestom.server.command.builder; + +import net.minestom.server.command.builder.exception.ArgumentSyntaxException; + +@FunctionalInterface +public interface ArgumentMapper { + + O accept(I i) throws ArgumentSyntaxException; + +} diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index bc0514fcc..f1db86f3f 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -1,10 +1,7 @@ package net.minestom.server.command.builder.arguments; import com.google.common.annotations.Beta; -import net.minestom.server.command.builder.ArgumentCallback; -import net.minestom.server.command.builder.Command; -import net.minestom.server.command.builder.CommandExecutor; -import net.minestom.server.command.builder.NodeMaker; +import net.minestom.server.command.builder.*; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.command.builder.suggestion.SuggestionCallback; import net.minestom.server.network.packet.server.play.DeclareCommandsPacket; @@ -220,6 +217,10 @@ public abstract class Argument { return suggestionCallback != null; } + public ArgumentMap map(ArgumentMapper mapper) { + return new ArgumentMap<>(this, mapper); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java new file mode 100644 index 000000000..68983df80 --- /dev/null +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java @@ -0,0 +1,34 @@ +package net.minestom.server.command.builder.arguments; + +import net.minestom.server.command.builder.ArgumentMapper; +import net.minestom.server.command.builder.NodeMaker; +import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +import org.jetbrains.annotations.NotNull; + +/** + * Represents an argument that maps an existing argument to a vlaue. + * @param The input (any object) + * @param The output (any object) + */ +public class ArgumentMap extends Argument { + + final Argument argument; + final ArgumentMapper mapper; + + public ArgumentMap(Argument argument, ArgumentMapper mapper) { + super(argument.getId()); + + this.argument = argument; + this.mapper = mapper; + } + + @Override + public @NotNull O parse(@NotNull String input) throws ArgumentSyntaxException { + return mapper.accept(argument.parse(input)); + } + + @Override + public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) { + argument.processNodes(nodeMaker, executable); + } +} diff --git a/src/test/java/demo/commands/UnloadExtensionCommand.java b/src/test/java/demo/commands/UnloadExtensionCommand.java index 115242638..4f686adaf 100644 --- a/src/test/java/demo/commands/UnloadExtensionCommand.java +++ b/src/test/java/demo/commands/UnloadExtensionCommand.java @@ -5,13 +5,11 @@ import net.minestom.server.MinecraftServer; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.Command; import net.minestom.server.command.builder.CommandContext; -import net.minestom.server.command.builder.arguments.Argument; -import net.minestom.server.command.builder.arguments.ArgumentString; +import net.minestom.server.command.builder.arguments.ArgumentMap; import net.minestom.server.command.builder.arguments.ArgumentType; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import net.minestom.server.extensions.Extension; import net.minestom.server.extensions.ExtensionManager; -import org.apache.commons.lang3.StringUtils; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -20,14 +18,20 @@ import java.nio.charset.StandardCharsets; public class UnloadExtensionCommand extends Command { - private final ArgumentString extensionName; + private final ArgumentMap extensionName; public UnloadExtensionCommand() { super("unload"); setDefaultExecutor(this::usage); - extensionName = ArgumentType.String("extensionName"); + extensionName = ArgumentType.String("extensionName").map((input) -> { + Extension extension = MinecraftServer.getExtensionManager().getExtension(input); + + if (extension == null) throw new ArgumentSyntaxException("The specified extension was not found", input, 1); + + return extension; + }); setArgumentCallback(this::extensionCallback, extensionName); @@ -39,29 +43,25 @@ public class UnloadExtensionCommand extends Command { } private void execute(CommandSender sender, CommandContext context) { - final String name = context.get(extensionName); - sender.sendMessage(Component.text("extensionName = " + name + "....")); + final Extension ext = context.get(extensionName); + sender.sendMessage(Component.text("extensionName = " + ext.getOrigin().getName() + "....")); ExtensionManager extensionManager = MinecraftServer.getExtensionManager(); - Extension ext = extensionManager.getExtension(name); - if (ext != null) { + + try { + extensionManager.unloadExtension(ext.getOrigin().getName()); + } catch (Throwable t) { try { - extensionManager.unloadExtension(name); - } catch (Throwable t) { - try { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - t.printStackTrace(); - t.printStackTrace(new PrintStream(baos)); - baos.flush(); - baos.close(); - String contents = baos.toString(StandardCharsets.UTF_8); - contents.lines().map(Component::text).forEach(sender::sendMessage); - } catch (IOException e) { - e.printStackTrace(); - } + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + t.printStackTrace(); + t.printStackTrace(new PrintStream(baos)); + baos.flush(); + baos.close(); + String contents = baos.toString(StandardCharsets.UTF_8); + contents.lines().map(Component::text).forEach(sender::sendMessage); + } catch (IOException e) { + e.printStackTrace(); } - } else { - sender.sendMessage(Component.text("Extension '" + name + "' does not exist.")); } } From dfae6ad5f8dd07dc4608f5babd7676767237b1a0 Mon Sep 17 00:00:00 2001 From: LeoDog896 Date: Tue, 6 Apr 2021 22:12:30 -0400 Subject: [PATCH 2/4] Documentation and visibility changes --- .../server/command/builder/ArgumentMapper.java | 16 ++++++++++++++++ .../command/builder/arguments/Argument.java | 8 ++++++++ .../command/builder/arguments/ArgumentMap.java | 5 +++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java b/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java index 73efefab7..07b944fd3 100644 --- a/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java +++ b/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java @@ -2,9 +2,25 @@ package net.minestom.server.command.builder; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; +/** + * Represents a lambda that can turn an input into an output + * that also allows the throwing of ArgumentSyntaxException + * + * @param The input expected from the Argument + * @param The desired output type from this lambda. + */ @FunctionalInterface public interface ArgumentMapper { + /** + * Accept's I data from the argument and returns O output + * + * @param i The input processed from an argument + * + * @return The complex data type that came as a result from this argument + * @throws ArgumentSyntaxException If the input can not be turned into the desired output + * (E.X. an invalid extension name) + */ O accept(I i) throws ArgumentSyntaxException; } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index f1db86f3f..2f9dd2d6c 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -217,6 +217,14 @@ public abstract class Argument { return suggestionCallback != null; } + /** + * Maps this argument's output to another result. + * + * @param mapper The mapper to use (this argument's input --> desired output) + * @param The type of output expected. + * + * @return A new ArgumentMap that can get this complex object type. + */ public ArgumentMap map(ArgumentMapper mapper) { return new ArgumentMap<>(this, mapper); } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java index 68983df80..9a7949203 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java @@ -6,7 +6,8 @@ import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; /** - * Represents an argument that maps an existing argument to a vlaue. + * Represents an argument that maps an existing argument to a value. + * * @param The input (any object) * @param The output (any object) */ @@ -15,7 +16,7 @@ public class ArgumentMap extends Argument { final Argument argument; final ArgumentMapper mapper; - public ArgumentMap(Argument argument, ArgumentMapper mapper) { + protected ArgumentMap(Argument argument, ArgumentMapper mapper) { super(argument.getId()); this.argument = argument; From e4c3345da7aed7cd34acf37f125c0b969e9c2ffe Mon Sep 17 00:00:00 2001 From: LeoDog896 Date: Fri, 9 Apr 2021 12:50:05 -0400 Subject: [PATCH 3/4] Add beta to map --- .../net/minestom/server/command/builder/arguments/Argument.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index 2f9dd2d6c..432e8fe4e 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -225,6 +225,7 @@ public abstract class Argument { * * @return A new ArgumentMap that can get this complex object type. */ + @Beta public ArgumentMap map(ArgumentMapper mapper) { return new ArgumentMap<>(this, mapper); } From ca6ee7c23a0de0d2eb2cd4b4b9b62d03d89cf71a Mon Sep 17 00:00:00 2001 From: LeoDog896 Date: Fri, 9 Apr 2021 12:54:02 -0400 Subject: [PATCH 4/4] Move ArgumentMapper inside ArgumentMap --- .../command/builder/ArgumentMapper.java | 26 ------------------- .../command/builder/arguments/Argument.java | 2 +- .../builder/arguments/ArgumentMap.java | 25 +++++++++++++++++- 3 files changed, 25 insertions(+), 28 deletions(-) delete mode 100644 src/main/java/net/minestom/server/command/builder/ArgumentMapper.java diff --git a/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java b/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java deleted file mode 100644 index 07b944fd3..000000000 --- a/src/main/java/net/minestom/server/command/builder/ArgumentMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.minestom.server.command.builder; - -import net.minestom.server.command.builder.exception.ArgumentSyntaxException; - -/** - * Represents a lambda that can turn an input into an output - * that also allows the throwing of ArgumentSyntaxException - * - * @param The input expected from the Argument - * @param The desired output type from this lambda. - */ -@FunctionalInterface -public interface ArgumentMapper { - - /** - * Accept's I data from the argument and returns O output - * - * @param i The input processed from an argument - * - * @return The complex data type that came as a result from this argument - * @throws ArgumentSyntaxException If the input can not be turned into the desired output - * (E.X. an invalid extension name) - */ - O accept(I i) throws ArgumentSyntaxException; - -} diff --git a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java index 432e8fe4e..df331552e 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/Argument.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/Argument.java @@ -226,7 +226,7 @@ public abstract class Argument { * @return A new ArgumentMap that can get this complex object type. */ @Beta - public ArgumentMap map(ArgumentMapper mapper) { + public ArgumentMap map(ArgumentMap.ArgumentMapper mapper) { return new ArgumentMap<>(this, mapper); } diff --git a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java index 9a7949203..4f69db1d5 100644 --- a/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java +++ b/src/main/java/net/minestom/server/command/builder/arguments/ArgumentMap.java @@ -1,6 +1,5 @@ package net.minestom.server.command.builder.arguments; -import net.minestom.server.command.builder.ArgumentMapper; import net.minestom.server.command.builder.NodeMaker; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; @@ -32,4 +31,28 @@ public class ArgumentMap extends Argument { public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) { argument.processNodes(nodeMaker, executable); } + + /** + * Represents a lambda that can turn an input into an output + * that also allows the throwing of ArgumentSyntaxException + * + * @param The input expected from the Argument + * @param The desired output type from this lambda. + */ + @FunctionalInterface + public interface ArgumentMapper { + + /** + * Accept's I data from the argument and returns O output + * + * @param i The input processed from an argument + * + * @return The complex data type that came as a result from this argument + * @throws ArgumentSyntaxException If the input can not be turned into the desired output + * (E.X. an invalid extension name) + */ + O accept(I i) throws ArgumentSyntaxException; + + } + }