This commit is contained in:
kento2 2026-07-06 16:35:01 +02:00
parent ac804b6c5b
commit 8897579a12
7 changed files with 165 additions and 52 deletions

View file

@ -9,6 +9,7 @@ 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;
@ -25,7 +26,7 @@ public class CommandParser<T> {
final Iterator<String> argStrIter = Arrays.stream(args).iterator();
final Map<String, ParsedArgument<T, ?>> parsedArguments = new HashMap<>();
while (argStrIter.hasNext()) {
while (true) {
for (var nodeArg : cur.getArguments()) {
var parsed = parseArgument(rootNode, nodeArg, argStrIter, sender, parseArgs);
if (parsed.hasFailure())
@ -48,10 +49,6 @@ public class CommandParser<T> {
return new ParseResult.NoPermission<>(cur, argStr);
cur = nextNode;
}
if (cur.getExecutor() == null)
return new ParseResult.LiteralExpected<>(cur);
return new ParseResult.Success<>(cur, parsedArguments);
}
@SuppressWarnings("unchecked")

View file

@ -0,0 +1,32 @@
package de.kentoj.kencommandapi.api.parser;
import de.kentoj.kencommandapi.api.CommandHandler;
import de.kentoj.kencommandapi.api.argument.CommandArgument;
import de.kentoj.kencommandapi.api.argument.types.StringArgumentType;
import de.kentoj.kencommandapi.api.node.CommandNode;
import de.kentoj.kencommandapi.api.platform.MessageStyle;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CommandHandlerTest {
@Test
void testSuggestions() {
var rootNode = CommandNode.rootNode(MessageStyle.PLAIN, "someRootNode");
var arg = CommandArgument.arg("someArg", new StringArgumentType<>());
arg.setSuggestionProvider(__ -> List.of("a", "b", "c"));
rootNode.addArgument(arg);
rootNode.setExecutor(ENV.EMPTY_EXECUTOR);
var handler = new CommandHandler<>(
new CommandParser<>((__, ___) -> true),
(__, ___) -> {},
(__, ___) -> true
);
var suggestions = handler.getSuggestions(rootNode, ENV.SENDER, new String[0]);
assertEquals(List.of("a", "b", "c"), suggestions);
}
}

View file

@ -0,0 +1,43 @@
package de.kentoj.kencommandapi.api.parser;
import com.leakyabstractions.result.core.Results;
import de.kentoj.kencommandapi.api.argument.CommandArgument;
import de.kentoj.kencommandapi.api.argument.types.StringArgumentType;
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
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.MessageStyle;
import org.junit.jupiter.api.Test;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
public class CommandParserTest {
@Test
void checkArgumentExpected() {
RootCommandNode<Object> node = CommandNode.rootNode(MessageStyle.PLAIN, "someRootNode");
var arg = CommandArgument.arg("someArg", new StringArgumentType<>(false));
node.addArgument(arg);
var parsed = ENV.PARSER.parseLiteral(node, ENV.SENDER, new String[]{}, false);
assertInstanceOf(ParseResult.ArgumentExpected.class, parsed);
}
@Test
void checkGreedyStrings() {
RootCommandNode<Object> node = CommandNode.rootNode(MessageStyle.PLAIN, "someRootNode");
var arg = CommandArgument.arg("someArg", new StringArgumentType<>(true));
node.addArgument(arg);
node.setExecutor(ENV.EMPTY_EXECUTOR);
var parsed = ENV.PARSER.parseLiteral(node, ENV.SENDER, new String[]{"part1", "part2"}, true);
Map<String, ParsedArgument<Object, ?>> parsedStr = ((ParseResult.Success<Object>) parsed).getParsedArguments();
String str = (String) parsedStr.get("someArg").getValue();
assertEquals("part1 part2", str);
}
}

View file

@ -0,0 +1,13 @@
package de.kentoj.kencommandapi.api.parser;
import com.leakyabstractions.result.core.Results;
import de.kentoj.kencommandapi.api.invocation.CommandExecutor;
import java.util.concurrent.CompletableFuture;
public class ENV {
public static final CommandParser<Object> PARSER = new CommandParser<>((__, ___) -> true);
public static final Object SENDER = new Object();
public static final CommandExecutor<Object> EMPTY_EXECUTOR = __ ->
CompletableFuture.completedFuture(Results.success(new Object()));
}