diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 4ba5097..1eb1391 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,15 +5,28 @@
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -58,6 +71,13 @@
+
+
+
+
+
+
+
@@ -114,41 +134,41 @@
- {
+ "keyToString": {
+ "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [:kencommandapi-core:de.kentoj.kencommandapi.Main.main()].executor": "Run",
+ "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [build].executor": "Run",
+ "Gradle./home/a/src/kento2/KenCommandAPI/kencommandapi-core [publish].executor": "Run",
+ "Gradle.CommandParserTest.checkArgumentExpected.executor": "Run",
+ "Gradle.Download Sources.executor": "Run",
+ "Gradle.KenCommandAPI [:de.kencommand.Main.main()].executor": "Run",
+ "Gradle.KenCommandAPI [assemble].executor": "Run",
+ "Gradle.KenCommandAPI [buildEnvironment].executor": "Run",
+ "Gradle.KenCommandAPI [build].executor": "Run",
+ "Gradle.KenCommandAPI [clean test].executor": "Run",
+ "Gradle.KenCommandAPI [clean].executor": "Run",
+ "Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository].executor": "Run",
+ "Gradle.KenCommandAPI [publish].executor": "Run",
+ "Gradle.KenCommandAPI [test].executor": "Run",
+ "Gradle.KenCommandAPI:kencommandapi-bukkit [build].executor": "Run",
+ "Gradle.KenCommandAPI:kencommandapi-bukkit [generatePomFileForKenCommandAPIBukkitPublication].executor": "Run",
+ "Gradle.KenCommandAPI:kencommandapi-bukkit [publishAllPublicationsToScrowRepository].executor": "Run",
+ "Gradle.KenCommandAPI:kencommandapi-bukkit [publish].executor": "Run",
+ "Gradle.KenCommandAPI:kencommandapi-velocity [publish].executor": "Run",
+ "Gradle.kencommandapi-core [build].executor": "Run",
+ "ModuleVcsDetector.initialDetectionPerformed": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
+ "RunOnceActivity.git.unshallow": "true",
+ "git-widget-placeholder": "master",
+ "kotlin-language-version-configured": "true",
+ "last_opened_file_path": "/home/a/src/scrow/core",
+ "project.structure.last.edited": "Modules",
+ "project.structure.proportion": "0.15",
+ "project.structure.side.proportion": "0.6268199",
+ "settings.editor.selected.configurable": "preferences.pluginManager"
}
-}]]>
+}
@@ -166,11 +186,11 @@
+
-
@@ -182,7 +202,7 @@
-
+
@@ -207,6 +227,28 @@
true
+
+
+
+
+
+
+
+
+
+
+ true
+ true
+ false
+ false
+
+
@@ -230,28 +272,6 @@
false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
- true
- false
- false
-
-
@@ -298,11 +318,11 @@
+
+
-
-
diff --git a/TODO b/TODO
index b801d86..8d50a63 100644
--- a/TODO
+++ b/TODO
@@ -1,4 +1 @@
-- use version catalog
-- fix missing ArgumentExpected error at first arg or smth (maybe all args are shifted ???)
-- make sure permissions of literals work
-- fix suggestions/tab completion
\ No newline at end of file
+- suggest next literal/argument
\ No newline at end of file
diff --git a/build.gradle.kts b/build.gradle.kts
index 8c27e8d..b51ec73 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,5 +1,5 @@
group = "de.kentoj.scrow"
-version = "0.32"
+version = "0.33-SNAPSHOT"
subprojects {
group = rootProject.group
diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java
index 119166e..25dbe36 100644
--- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java
+++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/BukkitKenCommand.java
@@ -1,7 +1,7 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.CommandHandler;
-import de.kentoj.kencommandapi.api.node.RootCommandNode;
+import de.kentoj.kencommandapi.api.literal.RootLiteral;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@@ -10,18 +10,18 @@ import java.util.Arrays;
public class BukkitKenCommand extends Command {
- private final RootCommandNode rootNode;
+ private final RootLiteral rootNode;
private final CommandHandler commandHandler;
protected BukkitKenCommand(
CommandHandler commandHandler,
- RootCommandNode rootNode
+ RootLiteral rootLiteral
) {
- super(rootNode.getNames()[0]);
+ super(rootLiteral.getNames()[0]);
this.commandHandler = commandHandler;
- this.rootNode = rootNode;
- this.setAliases(Arrays.asList(rootNode.getNames()));
- this.setPermission(rootNode.getPermission());
+ this.rootNode = rootLiteral;
+ this.setAliases(Arrays.asList(rootLiteral.getNames()));
+ this.setPermission(rootLiteral.getPermission());
}
@Override
diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java
index 97f8033..9c27132 100644
--- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java
+++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/CommandAPI.java
@@ -1,8 +1,7 @@
package de.kentoj.kencommandapi;
import de.kentoj.kencommandapi.api.CommandHandler;
-import de.kentoj.kencommandapi.api.node.RootCommandNode;
-import de.kentoj.kencommandapi.api.parser.CommandParser;
+import de.kentoj.kencommandapi.api.literal.RootLiteral;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
@@ -17,12 +16,11 @@ import java.util.List;
public class CommandAPI {
private final CommandHandler commandHandler;
- private final List> registeredNodes = new ArrayList<>();
+ private final List> registeredNodes = new ArrayList<>();
private final SimpleCommandMap commandMap;
public CommandAPI(Plugin plugin) {
- this.commandHandler = new CommandHandler<>(new CommandParser<>(Permissible::hasPermission),
- CommandSender::sendMessage, Permissible::hasPermission);
+ this.commandHandler = new CommandHandler<>(CommandSender::sendMessage, Permissible::hasPermission);
Bukkit.getPluginManager().registerEvents(new TabCompleteListener(this, commandHandler), plugin);
try {
@@ -34,7 +32,7 @@ public class CommandAPI {
}
}
- @Nullable RootCommandNode getRegistered(String name) {
+ @Nullable RootLiteral getRegistered(String name) {
for (var node : registeredNodes) {
for (String nodeName : node.getNames()) {
if (nodeName.equals(name)) return node;
@@ -43,7 +41,7 @@ public class CommandAPI {
return null;
}
- public void register(RootCommandNode rootNode) {
+ public void register(RootLiteral rootNode) {
registeredNodes.add(rootNode);
commandMap.register(rootNode.getNames()[0], new BukkitKenCommand(commandHandler, rootNode));
}
diff --git a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java
index 6935201..70c0479 100644
--- a/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java
+++ b/kencommandapi-bukkit/src/main/java/de/kentoj/kencommandapi/TabCompleteListener.java
@@ -7,6 +7,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
+import java.util.Arrays;
+
@RequiredArgsConstructor
public class TabCompleteListener implements Listener {
@@ -17,11 +19,11 @@ public class TabCompleteListener implements Listener {
public void onAsyncTabComplete(AsyncTabCompleteEvent ev) {
if (!ev.isCommand()) return;
- var args = ev.getBuffer().split(" ");
+ var args = ev.getBuffer().substring(1).split(" ");
var label = args[0];
var rootNode = commandAPI.getRegistered(label);
if (rootNode == null) return;
ev.setHandled(true);
- ev.setCompletions(commandHandler.getSuggestions(rootNode, ev.getSender(), args));
+ ev.setCompletions(commandHandler.getSuggestions(rootNode, ev.getSender(), Arrays.copyOfRange(args, 1, args.length)));
}
}
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java
index 9f5e5ad..9738558 100644
--- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java
+++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java
@@ -1,66 +1,46 @@
package de.kentoj.kencommandapi.api;
import de.kentoj.kencommandapi.api.invocation.CommandContext;
-import de.kentoj.kencommandapi.api.node.CommandNode;
-import de.kentoj.kencommandapi.api.node.RootCommandNode;
-import de.kentoj.kencommandapi.api.parser.CommandParser;
-import de.kentoj.kencommandapi.api.parser.ParseResult;
+import de.kentoj.kencommandapi.api.literal.RootLiteral;
+import de.kentoj.kencommandapi.api.parser2.InvocationCommandParser;
+import de.kentoj.kencommandapi.api.parser2.SuggestionCommandParser;
import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
import de.kentoj.kencommandapi.api.platform.SendMessageMethod;
import lombok.RequiredArgsConstructor;
-import org.jetbrains.annotations.Nullable;
-import java.util.Arrays;
import java.util.List;
@RequiredArgsConstructor
public class CommandHandler {
- private final CommandParser commandParser;
private final SendMessageMethod sendMessageMethod;
- private final HasPermissionMethod hasPermissionMethod;
- public void invoke(RootCommandNode rootNode, T sender, String[] args) {
- var parseResult = commandParser.parseLiteral(rootNode, sender, args, true);
- if (!(parseResult instanceof ParseResult.Success)) {
- sendMessageMethod.send(sender, rootNode.getMessageStyle().err(parseResult.getMessage()));
- return;
- }
+ private final InvocationCommandParser invocationParser;
+ private final SuggestionCommandParser suggestionParser;
- var ctx = new CommandContext<>(sender, ((ParseResult.Success) parseResult).getParsedArguments());
- assert parseResult.getLiteral().getExecutor() != null;
- parseResult.getLiteral().getExecutor().execute(ctx).whenComplete((result, ex) -> {
- if (ex != null)
- sendMessageMethod.send(sender, rootNode.getMessageStyle().exception(ex));
- result.ifFailure(failure ->
- sendMessageMethod.send(sender, rootNode.getMessageStyle().err(failure)));
- });
+ public CommandHandler(SendMessageMethod sendMessageMethod, HasPermissionMethod hasPermissionMethod) {
+ this.sendMessageMethod = sendMessageMethod;
+ invocationParser = new InvocationCommandParser<>(hasPermissionMethod);
+ suggestionParser = new SuggestionCommandParser<>(hasPermissionMethod);
}
- public List getSuggestions(RootCommandNode rootNode, T sender, String[] args) {
- var parseResult = commandParser.parseLiteral(rootNode, sender, args, false);
-
- if (parseResult instanceof ParseResult.ArgumentExpected) {
- var arg = ((ParseResult.ArgumentExpected) parseResult).getArgument();
- return arg.getSuggestionProvider().suggest(sender);
- }
-
- String filter = null;
- if (parseResult instanceof ParseResult.UnknownLiteral)
- filter = ((ParseResult.UnknownLiteral) parseResult).getInput();
- else if (parseResult instanceof ParseResult.NoPermission)
- filter = ((ParseResult.NoPermission) parseResult).getInput();
- return getSuggestions(sender, parseResult.getLiteral(), filter);
+ @SuppressWarnings("CodeBlock2Expr")
+ public void invoke(RootLiteral rootLiteral, T sender, String[] args) {
+ invocationParser.invoke(rootLiteral, sender, args)
+ .ifSuccessOrElse(data -> {
+ var ctx = new CommandContext<>(sender, data.getArguments());
+ data.getExecutor().execute(ctx).whenComplete((result, ex) -> {
+ if (ex != null)
+ sendMessageMethod.send(sender, rootLiteral.getMessageStyle().exception(ex));
+ result.ifFailure(err ->
+ sendMessageMethod.send(sender, rootLiteral.getMessageStyle().err(err)));
+ });
+ }, err -> {
+ sendMessageMethod.send(sender, rootLiteral.getMessageStyle().err(err));
+ });
}
- private List getSuggestions(T sender, CommandNode literal, @Nullable String filter) {
- var stream = literal.getLiterals().stream()
- .filter(lit -> lit.getPermission() != null && hasPermissionMethod.hasPermission(sender, lit.getPermission()))
- .map(CommandNode::getNames)
- .flatMap(Arrays::stream);
- if (filter != null)
- stream = stream.filter(f -> f.toLowerCase().contains(filter.toLowerCase()));
-
- return stream.toList();
+ public List getSuggestions(RootLiteral rootNode, T sender, String[] args) {
+ return suggestionParser.getSuggestions(rootNode, sender, args);
}
-}
+}
\ No newline at end of file
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/CommandNode.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java
similarity index 58%
rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/CommandNode.java
rename to kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java
index 4b956b8..531905b 100644
--- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/CommandNode.java
+++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/Literal.java
@@ -1,23 +1,23 @@
-package de.kentoj.kencommandapi.api.node;
+package de.kentoj.kencommandapi.api.literal;
import de.kentoj.kencommandapi.api.platform.MessageStyle;
import de.kentoj.kencommandapi.api.argument.CommandArgument;
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
-import de.kentoj.kencommandapi.internal.CommandNodeImpl;
-import de.kentoj.kencommandapi.internal.RootCommandNodeImpl;
+import de.kentoj.kencommandapi.internal.LiteralImpl;
+import de.kentoj.kencommandapi.internal.RootLiteralImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Set;
-public interface CommandNode {
- static CommandNode node(String... name) {
- return new CommandNodeImpl<>(name);
+public interface Literal {
+ static Literal literal(String... name) {
+ return new LiteralImpl<>(name);
}
- static RootCommandNode rootNode(MessageStyle messageStyle, String...name) {
- return new RootCommandNodeImpl<>(messageStyle, name);
+ static RootLiteral rootLiteral(MessageStyle messageStyle, String...name) {
+ return new RootLiteralImpl<>(messageStyle, name);
}
@NotNull String[] getNames();
@@ -32,7 +32,8 @@ public interface CommandNode {
/**
* @throws IllegalArgumentException if there is already an argument with the same id
- * @throws IllegalStateException if a greedy argument was added to the node previously
+ * @throws IllegalStateException if a greedy argument was added to the literal previously
+ * @throws IllegalStateException if the literal already has a child literal assigned to it
*/
void addArgument(CommandArgument argument);
@@ -48,13 +49,14 @@ public interface CommandNode {
/**
* @throws IllegalArgumentException if there is already a literal with the same name
- * @throws IllegalStateException if a greedy argument was added to the node previously
+ * @throws IllegalStateException if a greedy argument was added to the literal previously
+ * @throws IllegalStateException if the literal already has an argument assigned to it
*/
- void addLiteral(@NotNull CommandNode commandNode);
+ void addLiteral(@NotNull Literal literal);
- @Nullable CommandNode getLiteral(@NotNull String name);
+ @Nullable Literal getLiteral(@NotNull String name);
- @NotNull Set> getLiterals();
+ @NotNull Set> getLiterals();
@Nullable String getPermission();
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/RootCommandNode.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java
similarity index 59%
rename from kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/RootCommandNode.java
rename to kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java
index 68acae4..cefcbee 100644
--- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/node/RootCommandNode.java
+++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/literal/RootLiteral.java
@@ -1,8 +1,8 @@
-package de.kentoj.kencommandapi.api.node;
+package de.kentoj.kencommandapi.api.literal;
import de.kentoj.kencommandapi.api.platform.MessageStyle;
-public interface RootCommandNode extends CommandNode {
+public interface RootLiteral extends Literal {
MessageStyle getMessageStyle();
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java
deleted file mode 100644
index 030e4d2..0000000
--- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package de.kentoj.kencommandapi.api.parser;
-
-import com.leakyabstractions.result.api.Result;
-import com.leakyabstractions.result.core.Results;
-import de.kentoj.kencommandapi.api.argument.CommandArgument;
-import de.kentoj.kencommandapi.api.invocation.ParsedArgument;
-import de.kentoj.kencommandapi.api.node.CommandNode;
-import de.kentoj.kencommandapi.api.node.RootCommandNode;
-import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
-import de.kentoj.kencommandapi.internal.ParsedArgumentImpl;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-@RequiredArgsConstructor
-public class CommandParser {
-
- private final HasPermissionMethod hasPermissionMethod;
-
- public ParseResult parseLiteral(RootCommandNode rootNode, T sender, String[] args, boolean parseArgs) {
- CommandNode cur = rootNode;
- final Iterator argStrIter = Arrays.stream(args).iterator();
- final Map> parsedArguments = new HashMap<>();
-
- while (true) {
- for (var nodeArg : cur.getArguments()) {
- var parsed = parseArgument(rootNode, nodeArg, argStrIter, sender, parseArgs);
- if (parsed.hasFailure())
- return parsed.getFailure().orElseThrow();
- if (parseArgs)
- parsedArguments.put(nodeArg.getId(), parsed.getSuccess().orElseThrow());
- }
-
- if (!argStrIter.hasNext()) {
- if (cur.getExecutor() == null)
- return new ParseResult.LiteralExpected<>(cur);
- return new ParseResult.Success<>(cur, parsedArguments);
- }
-
- var argStr = argStrIter.next();
- var nextNode = cur.getLiteral(argStr);
- if (nextNode == null)
- return new ParseResult.UnknownLiteral<>(cur, argStr);
- if (nextNode.getPermission() != null && !hasPermissionMethod.hasPermission(sender, nextNode.getPermission()))
- return new ParseResult.NoPermission<>(cur, argStr);
- cur = nextNode;
- }
- }
-
- @SuppressWarnings("unchecked")
- private Result, ParseResult> parseArgument(
- CommandNode node,
- CommandArgument nodeArg,
- Iterator args,
- T sender,
- boolean parseArgs
- ) {
- if (!args.hasNext()) {
- if (nodeArg.getDefaultValueProvider() == null)
- return Results.failure(new ParseResult.ArgumentExpected<>(node, nodeArg));
- var value = nodeArg.getDefaultValueProvider().apply(sender);
- return Results.success(toParsed(value, nodeArg));
- }
-
- Object value = null;
- var argStr = getRawArgument(args, nodeArg);
- if (parseArgs) {
- try {
- value = nodeArg.getType().parseInput(argStr);
- } catch (IllegalArgumentException ex) {
- return Results.failure(new ParseResult.IllegalArgument<>(node, nodeArg, ex.getMessage(), argStr));
- }
- }
-
- var parsedArg = new ParsedArgumentImpl<>(value, (CommandArgument) nodeArg);
- return Results.success(parsedArg);
- }
-
- @SuppressWarnings("unchecked")
- private ParsedArgument toParsed(Object value, CommandArgument arg) {
- return new ParsedArgumentImpl<>(value, (CommandArgument) arg);
- }
-
- private String getRawArgument(Iterator args, CommandArgument arg) {
- StringBuilder rawArgument = new StringBuilder();
-
- if (arg.getType().isGreedy()) {
- while (args.hasNext()) {
- rawArgument.append(" ");
- rawArgument.append(args.next());
- }
- rawArgument.deleteCharAt(0);
- } else {
- rawArgument = new StringBuilder(args.next());
- }
-
- return rawArgument.toString();
- }
-}
\ No newline at end of file
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java
deleted file mode 100644
index 4c8d189..0000000
--- a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package de.kentoj.kencommandapi.api.parser;
-
-import de.kentoj.kencommandapi.api.argument.CommandArgument;
-import de.kentoj.kencommandapi.api.invocation.ParsedArgument;
-import de.kentoj.kencommandapi.api.node.CommandNode;
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-
-import java.util.Map;
-
-public abstract sealed class ParseResult permits ParseResult.IllegalArgument, ParseResult.ArgumentExpected,
- ParseResult.LiteralExpected, ParseResult.NoPermission, ParseResult.Success, ParseResult.UnknownLiteral {
-
- /**
- * @return last successfully literal
- */
- public abstract CommandNode getLiteral();
-
- public abstract String getMessage();
-
- @RequiredArgsConstructor
- public static final class ArgumentExpected extends ParseResult {
- @Getter
- private final CommandNode literal;
- @Getter
- private final CommandArgument argument;
-
- @Override
- public String getMessage() {
- return "Argument expected: " + argument.getId();
- }
- }
-
- @RequiredArgsConstructor
- public static final class UnknownLiteral extends ParseResult {
- private final CommandNode previousLiteral;
- @Getter
- private final String input;
-
- @Override
- public String getMessage() {
- return "Unknown subcommand: " + input;
- }
-
- @Override
- public CommandNode getLiteral() {
- return previousLiteral;
- }
- }
-
- @RequiredArgsConstructor
- public static final class LiteralExpected extends ParseResult {
- @Getter
- private final CommandNode literal;
-
- @Override
- public String getMessage() {
- return "Subcommand expected";
- }
- }
-
- @RequiredArgsConstructor
- public static final class Success extends ParseResult {
- @Getter
- private final CommandNode literal;
- @Getter
- private final Map> parsedArguments;
-
- @Override
- public String getMessage() {
- return "";
- }
- }
-
- @RequiredArgsConstructor
- public static final class NoPermission extends ParseResult {
- @Getter
- private final CommandNode literal;
- @Getter
- private final String input;
-
- @Override
- public String getMessage() {
- return "Unknown subcommand: " + input;
- }
- }
-
- @RequiredArgsConstructor
- public static final class IllegalArgument extends ParseResult {
- @Getter
- private final CommandNode literal;
- private final CommandArgument argument;
- private final String message;
- /**
- * Input passed to the parser
- */
- @Getter
- private final String argStr;
-
- public IllegalArgument(CommandNode literal, CommandArgument argument, Throwable throwable, String argStr) {
- this.literal = literal;
- this.argument = argument;
- this.argStr = argStr;
- while (throwable.getMessage() == null && throwable.getCause() != null)
- throwable = throwable.getCause();
- message = throwable.getMessage();
- }
-
- @Override
- public String getMessage() {
- return "Illegal argument '" + argStr + "' for " + argument.getId() + ": " + message;
- }
- }
-}
diff --git a/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/AbstractCommandParser.java b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/AbstractCommandParser.java
new file mode 100644
index 0000000..0564e56
--- /dev/null
+++ b/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser2/AbstractCommandParser.java
@@ -0,0 +1,39 @@
+package de.kentoj.kencommandapi.api.parser2;
+
+import com.leakyabstractions.result.api.Result;
+import com.leakyabstractions.result.core.Results;
+import de.kentoj.kencommandapi.api.argument.CommandArgument;
+import de.kentoj.kencommandapi.api.literal.Literal;
+import de.kentoj.kencommandapi.api.platform.HasPermissionMethod;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@RequiredArgsConstructor
+public abstract class AbstractCommandParser {
+
+ private final HasPermissionMethod hasPermission;
+
+ protected boolean hasPermission(T sender, Literal literal) {
+ if (literal.getPermission() == null) return true;
+ return hasPermission.test(sender, literal.getPermission());
+ }
+
+ protected String parseInput(String[] args, AtomicInteger index, boolean isGreedy) {
+ if (!isGreedy)
+ return args[index.getAndIncrement()];
+
+ var ret = String.join(" ", Arrays.copyOfRange(args, index.get(), args.length));
+ index.set(args.length);
+ return ret;
+ }
+
+ protected Result