From 43e18f6a04a3cc4069c2d2f32c1d94c9a9a68523 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Mon, 6 Nov 2017 14:45:54 +0100 Subject: [PATCH] Allow redirect modifiers to throw exceptions --- .../java/com/mojang/brigadier/CommandDispatcher.java | 2 +- .../java/com/mojang/brigadier/RedirectModifier.java | 11 +++++++++++ .../com/mojang/brigadier/builder/ArgumentBuilder.java | 7 ++++--- .../mojang/brigadier/tree/ArgumentCommandNode.java | 3 ++- .../java/com/mojang/brigadier/tree/CommandNode.java | 7 ++++--- .../com/mojang/brigadier/tree/LiteralCommandNode.java | 3 ++- .../com/mojang/brigadier/CommandDispatcherTest.java | 2 +- 7 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/mojang/brigadier/RedirectModifier.java diff --git a/src/main/java/com/mojang/brigadier/CommandDispatcher.java b/src/main/java/com/mojang/brigadier/CommandDispatcher.java index 6163bd4..6be44cf 100644 --- a/src/main/java/com/mojang/brigadier/CommandDispatcher.java +++ b/src/main/java/com/mojang/brigadier/CommandDispatcher.java @@ -87,7 +87,7 @@ public class CommandDispatcher { final CommandContextBuilder child = context.getChild(); if (child != null) { if (!child.getNodes().isEmpty()) { - final Function, Collection> modifier = Iterators.getLast(context.getNodes().keySet().iterator()).getRedirectModifier(); + final RedirectModifier modifier = Iterators.getLast(context.getNodes().keySet().iterator()).getRedirectModifier(); for (final S source : modifier.apply(context.build())) { contexts.add(child.copy().withSource(source)); } diff --git a/src/main/java/com/mojang/brigadier/RedirectModifier.java b/src/main/java/com/mojang/brigadier/RedirectModifier.java new file mode 100644 index 0000000..0393e33 --- /dev/null +++ b/src/main/java/com/mojang/brigadier/RedirectModifier.java @@ -0,0 +1,11 @@ +package com.mojang.brigadier; + +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; + +import java.util.Collection; + +@FunctionalInterface +public interface RedirectModifier { + Collection apply(CommandContext context) throws CommandSyntaxException; +} diff --git a/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java b/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java index 34b0e38..dbc3d49 100644 --- a/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java +++ b/src/main/java/com/mojang/brigadier/builder/ArgumentBuilder.java @@ -1,6 +1,7 @@ package com.mojang.brigadier.builder; import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.RootCommandNode; @@ -15,7 +16,7 @@ public abstract class ArgumentBuilder> { private Command command; private Predicate requirement = s -> true; private CommandNode target; - private Function, Collection> modifier = s -> Collections.singleton(s.getSource()); + private RedirectModifier modifier = s -> Collections.singleton(s.getSource()); protected abstract T getThis(); @@ -53,7 +54,7 @@ public abstract class ArgumentBuilder> { return redirect(target, modifier); } - public T redirect(final CommandNode target, final Function, Collection> modifier) { + public T redirect(final CommandNode target, final RedirectModifier modifier) { if (!arguments.getChildren().isEmpty()) { throw new IllegalStateException("Cannot redirect a node with children"); } @@ -66,7 +67,7 @@ public abstract class ArgumentBuilder> { return target; } - public Function, Collection> getRedirectModifier() { + public RedirectModifier getRedirectModifier() { return modifier; } diff --git a/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java b/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java index 079c3b5..8e2bb79 100644 --- a/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/ArgumentCommandNode.java @@ -1,6 +1,7 @@ package com.mojang.brigadier.tree; import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.builder.RequiredArgumentBuilder; @@ -21,7 +22,7 @@ public class ArgumentCommandNode extends CommandNode { private final String name; private final ArgumentType type; - public ArgumentCommandNode(final String name, final ArgumentType type, final Command command, final Predicate requirement, final CommandNode redirect, final Function, Collection> modifier) { + public ArgumentCommandNode(final String name, final ArgumentType type, final Command command, final Predicate requirement, final CommandNode redirect, final RedirectModifier modifier) { super(command, requirement, redirect, modifier); this.name = name; this.type = type; diff --git a/src/main/java/com/mojang/brigadier/tree/CommandNode.java b/src/main/java/com/mojang/brigadier/tree/CommandNode.java index 1b99ddf..a75f824 100644 --- a/src/main/java/com/mojang/brigadier/tree/CommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java @@ -3,6 +3,7 @@ package com.mojang.brigadier.tree; import com.google.common.collect.ComparisonChain; import com.google.common.collect.Maps; import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.context.CommandContext; @@ -21,10 +22,10 @@ public abstract class CommandNode implements Comparable> { private Map> children = Maps.newLinkedHashMap(); private final Predicate requirement; private final CommandNode redirect; - private final Function, Collection> modifier; + private final RedirectModifier modifier; private Command command; - protected CommandNode(final Command command, final Predicate requirement, final CommandNode redirect, final Function, Collection> modifier) { + protected CommandNode(final Command command, final Predicate requirement, final CommandNode redirect, final RedirectModifier modifier) { this.command = command; this.requirement = requirement; this.redirect = redirect; @@ -43,7 +44,7 @@ public abstract class CommandNode implements Comparable> { return redirect; } - public Function, Collection> getRedirectModifier() { + public RedirectModifier getRedirectModifier() { return modifier; } diff --git a/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java b/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java index 84ec976..9f21c3f 100644 --- a/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java +++ b/src/main/java/com/mojang/brigadier/tree/LiteralCommandNode.java @@ -1,6 +1,7 @@ package com.mojang.brigadier.tree; import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.context.CommandContext; @@ -18,7 +19,7 @@ public class LiteralCommandNode extends CommandNode { private final String literal; - public LiteralCommandNode(final String literal, final Command command, final Predicate requirement, final CommandNode redirect, final Function, Collection> modifier) { + public LiteralCommandNode(final String literal, final Command command, final Predicate requirement, final CommandNode redirect, final RedirectModifier modifier) { super(command, requirement, redirect, modifier); this.literal = literal; } diff --git a/src/test/java/com/mojang/brigadier/CommandDispatcherTest.java b/src/test/java/com/mojang/brigadier/CommandDispatcherTest.java index 43f0182..506973c 100644 --- a/src/test/java/com/mojang/brigadier/CommandDispatcherTest.java +++ b/src/test/java/com/mojang/brigadier/CommandDispatcherTest.java @@ -254,7 +254,7 @@ public class CommandDispatcherTest { @SuppressWarnings("unchecked") @Test public void testExecuteRedirected() throws Exception { - final Function, Collection> modifier = mock(Function.class); + final RedirectModifier modifier = mock(RedirectModifier.class); final Object source1 = new Object(); final Object source2 = new Object();