From e97dd6bb7946a2622a08a9740b0cbe058befb23d Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Wed, 8 Nov 2017 16:05:38 +0100 Subject: [PATCH] Allow consuming of command results --- build.gradle | 2 +- .../mojang/brigadier/CommandDispatcher.java | 29 +++++++++++++++---- .../com/mojang/brigadier/ResultConsumer.java | 8 +++++ 3 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/mojang/brigadier/ResultConsumer.java diff --git a/build.gradle b/build.gradle index 45e26e5..6226324 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ import groovy.io.FileType apply plugin: 'java-library' apply plugin: 'maven' -version = '0.1.5' +version = '0.1.6' group = 'com.mojang' task wrapper(type: Wrapper) { diff --git a/src/main/java/com/mojang/brigadier/CommandDispatcher.java b/src/main/java/com/mojang/brigadier/CommandDispatcher.java index 5fbeec2..c99b123 100644 --- a/src/main/java/com/mojang/brigadier/CommandDispatcher.java +++ b/src/main/java/com/mojang/brigadier/CommandDispatcher.java @@ -6,6 +6,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.context.StringRange; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -47,6 +48,8 @@ public class CommandDispatcher { return input != null && (input.getCommand() != null || input.getChildren().stream().anyMatch(hasCommand)); } }; + private ResultConsumer consumer = (c, s, r) -> { + }; public CommandDispatcher(final RootCommandNode root) { this.root = root; @@ -62,6 +65,10 @@ public class CommandDispatcher { return build; } + public void setConsumer(final ResultConsumer consumer) { + this.consumer = consumer; + } + public int execute(final String input, final S source) throws CommandSyntaxException { final ParseResults parse = parse(input, source); return execute(parse); @@ -84,26 +91,36 @@ public class CommandDispatcher { contexts.add(parse.getContext()); while (!contexts.isEmpty()) { - final CommandContextBuilder context = contexts.removeLast(); - final CommandContextBuilder child = context.getChild(); + final CommandContextBuilder builder = contexts.removeLast(); + final CommandContextBuilder child = builder.getChild(); + final CommandContext context = builder.build(); if (child != null) { if (!child.getNodes().isEmpty()) { - final RedirectModifier modifier = Iterators.getLast(context.getNodes().keySet().iterator()).getRedirectModifier(); - final Collection results = modifier.apply(context.build()); + final RedirectModifier modifier = Iterators.getLast(builder.getNodes().keySet().iterator()).getRedirectModifier(); + final Collection results = modifier.apply(context); if (results.isEmpty()) { + consumer.onCommandComplete(context, false, 0); return 0; } for (final S source : results) { contexts.add(child.copy().withSource(source)); } } - } else if (context.getCommand() != null) { + } else if (builder.getCommand() != null) { foundCommand = true; - result += context.getCommand().run(context.build()); + try { + final int value = builder.getCommand().run(context); + result += value; + consumer.onCommandComplete(context, true, value); + } catch (final CommandSyntaxException ex) { + consumer.onCommandComplete(context, false, 0); + throw ex; + } } } if (!foundCommand) { + consumer.onCommandComplete(parse.getContext().build(), false, 0); throw ERROR_UNKNOWN_COMMAND.createWithContext(parse.getReader()); } diff --git a/src/main/java/com/mojang/brigadier/ResultConsumer.java b/src/main/java/com/mojang/brigadier/ResultConsumer.java new file mode 100644 index 0000000..df4ae38 --- /dev/null +++ b/src/main/java/com/mojang/brigadier/ResultConsumer.java @@ -0,0 +1,8 @@ +package com.mojang.brigadier; + +import com.mojang.brigadier.context.CommandContext; + +@FunctionalInterface +public interface ResultConsumer { + void onCommandComplete(CommandContext context, boolean success, int result); +}