diff --git a/common/site/lab0x13/scrow/commands/CommandHandler.java b/common/site/lab0x13/scrow/commands/CommandHandler.java index 6c9a5f5..daa9cb7 100644 --- a/common/site/lab0x13/scrow/commands/CommandHandler.java +++ b/common/site/lab0x13/scrow/commands/CommandHandler.java @@ -2,7 +2,6 @@ package site.lab0x13.scrow.commands; import site.lab0x13.scrow.commands.model.CommandContext; import site.lab0x13.scrow.commands.model.literal.LiteralMeta; -import site.lab0x13.scrow.commands.model.literal.MessageStyle; import site.lab0x13.scrow.commands.model.literal.RootLiteral; import site.lab0x13.scrow.commands.parser.NodeTreeWalker; import site.lab0x13.scrow.commands.parser.WalkResult; @@ -45,23 +44,18 @@ public class CommandHandler> { String input = null; switch (walkResult) { case WalkResult.LiteralUnknown res -> { - stream = res.lastLiteral().subLiteralMetas().stream() - .filter(literalMeta -> platformAdapter.checkPermission(ctx, literalMeta.permission())) - .map(LiteralMeta::names) - .flatMap(Collection::stream); + stream = filterMetas(ctx, res.lastLiteral().subLiteralMetas()); input = res.input(); } case WalkResult.LiteralExpected res when trailingSpace -> - stream = res.lastLiteral().subLiteralMetas().stream() - .filter(literalMeta -> platformAdapter.checkPermission(ctx, literalMeta.permission())) - .map(LiteralMeta::names) - .flatMap(Collection::stream); + stream = filterMetas(ctx, res.lastLiteral().subLiteralMetas()); case WalkResult.ArgumentIllegal res -> { stream = res.arg().suggestionProvider().suggest(ctx, res.input()).stream(); input = res.input(); } case WalkResult.ArgumentExpected res when trailingSpace -> stream = res.arg().suggestionProvider().suggest(ctx, "").stream(); + case WalkResult.Complete res when !trailingSpace -> stream = filterMetas(ctx, res.alternativeLiterals()); default -> { return Collections.emptyList(); } @@ -73,4 +67,11 @@ public class CommandHandler> { .filter(s -> s.startsWith(finalInput)) .toList(); } + + private Stream filterMetas(C ctx, List metas) { + return metas.stream() + .filter(literalMeta -> platformAdapter.checkPermission(ctx, literalMeta.permission())) + .map(LiteralMeta::names) + .flatMap(Collection::stream); + } } \ No newline at end of file diff --git a/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java b/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java index c98a072..e6712c8 100644 --- a/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java +++ b/common/site/lab0x13/scrow/commands/parser/NodeTreeWalker.java @@ -7,6 +7,7 @@ import site.lab0x13.scrow.commands.model.argument.Argument; import site.lab0x13.scrow.commands.model.literal.Literal; import site.lab0x13.scrow.commands.model.literal.RootLiteral; +import java.util.Collections; import java.util.Iterator; import static java.util.Objects.requireNonNull; @@ -25,6 +26,7 @@ public class NodeTreeWalker> { Iterator iter ) { var cursor = new Cursor(iter); + Literal previousLiteral = null; Literal literal = rootLiteral; while (true) { @@ -41,6 +43,7 @@ public class NodeTreeWalker> { var nextLiteral = literal.getSubLiteral(literalName); if (nextLiteral == null || !platformAdapter.checkPermission(ctx, nextLiteral.permission())) return new WalkResult.LiteralUnknown<>(ctx, literal, literalName); + previousLiteral = literal; literal = nextLiteral; } @@ -49,7 +52,7 @@ public class NodeTreeWalker> { return new WalkResult.LiteralExpected<>(ctx, literal, isOptional); } - return new WalkResult.Complete<>(ctx, literal); + return new WalkResult.Complete<>(ctx, literal, previousLiteral == null ? Collections.emptyList() : previousLiteral.subLiteralMetas()); } private @Nullable WalkResult walkArgument( diff --git a/common/site/lab0x13/scrow/commands/parser/WalkResult.java b/common/site/lab0x13/scrow/commands/parser/WalkResult.java index 87a0223..ad07ed9 100644 --- a/common/site/lab0x13/scrow/commands/parser/WalkResult.java +++ b/common/site/lab0x13/scrow/commands/parser/WalkResult.java @@ -4,6 +4,9 @@ import org.jetbrains.annotations.Nullable; import site.lab0x13.scrow.commands.model.CommandContext; import site.lab0x13.scrow.commands.model.argument.Argument; import site.lab0x13.scrow.commands.model.literal.Literal; +import site.lab0x13.scrow.commands.model.literal.LiteralMeta; + +import java.util.List; public sealed interface WalkResult> { C ctx(); @@ -65,7 +68,8 @@ public sealed interface WalkResult> { record Complete>( C ctx, - Literal lastLiteral + Literal lastLiteral, + List alternativeLiterals ) implements WalkResult { @Override public boolean isValidUsage() { diff --git a/defs.bzl b/defs.bzl index 74497f2..60e3f05 100644 --- a/defs.bzl +++ b/defs.bzl @@ -1,2 +1,2 @@ GROUP = "site.lab0x13.scrow" -VERSION = "1.3.4" \ No newline at end of file +VERSION = "1.3.5" \ No newline at end of file