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

105
.idea/workspace.xml generated
View file

@ -5,23 +5,15 @@
</component>
<component name="ChangeListManager">
<list default="true" id="6414223f-1761-4683-97f5-9dab59d6c44a" name="Changes" comment=".">
<change afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowPublishConvention.kt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/configureScrowRepo.kt" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandHandlerTest.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/CommandParserTest.java" afterDir="false" />
<change afterPath="$PROJECT_DIR$/kencommandapi-core/src/test/java/de/kentoj/kencommandapi/api/parser/ENV.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/TODO" beforeDir="false" afterPath="$PROJECT_DIR$/TODO" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-bukkit/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/CommandHandler.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/argument/CommandArgument.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/CommandParser.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/parser/ParseResult.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/api/suggestion/SuggestionProvider.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandArgumentImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-core/src/main/java/de/kentoj/kencommandapi/internal/CommandArgumentImpl.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/kencommandapi-velocity/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/kencommandapi-velocity/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/settings.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/settings.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/build.gradle.kts" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowRepositoryConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowRepositoryConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/BaseDependenciesConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/BaseDependenciesConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowPublishConvention.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/ScrowPublishConvention.kt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/configureScrowRepo.kt" beforeDir="false" afterPath="$PROJECT_DIR$/../build-logic/convention/src/main/kotlin/scrow/configureScrowRepo.kt" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -73,6 +65,19 @@
<item name="Tasks" type="e4a08cd1:TasksNode" />
<item name="publishing" type="c8890929:TasksNode$1" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
<item name="KenCommandAPI" type="2d1252cf:ModuleNode" />
<item name="kencommandapi-bukkit" type="2d1252cf:ModuleNode" />
</path>
<path>
<item name="" type="6a2764b6:ExternalProjectsStructure$RootNode" />
<item name="KenCommandAPI" type="f1a62948:ProjectNode" />
<item name="KenCommandAPI" type="2d1252cf:ModuleNode" />
<item name="kencommandapi-bukkit" type="2d1252cf:ModuleNode" />
<item name="Tasks" type="e4a08cd1:TasksNode" />
</path>
</expand>
<select />
</tree_state>
@ -114,14 +119,17 @@
"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",
@ -170,10 +178,12 @@
<command value="publishAll" />
<command value="KenCommandAPI [publishAllPublicationsToScrowRepository]" />
<command value="gradlew buildEnvironment" />
<command value="./gradlew clean test" />
<command value="gradlew test" />
</option>
</component>
<component name="RunManager" selected="Gradle.KenCommandAPI [publish]">
<configuration name="KenCommandAPI [buildEnvironment]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<component name="RunManager" selected="Gradle.KenCommandAPI [test]">
<configuration name="CommandParserTest.checkArgumentExpected" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
@ -184,51 +194,32 @@
</option>
<option name="taskNames">
<list>
<option value="buildEnvironment" />
<option value=":kencommandapi-core:test" />
<option value="--tests" />
<option value="&quot;de.kentoj.kencommandapi.api.parser.CommandParserTest.checkArgumentExpected&quot;" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemDebugServerProcess>false</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<RunAsTest>true</RunAsTest>
<method v="2" />
</configuration>
<configuration name="KenCommandAPI [build]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<configuration name="KenCommandAPI [clean test]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="build" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<configuration name="KenCommandAPI [clean]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="clean" />
<option value="test" />
</list>
</option>
<option name="vmOptions" />
@ -283,13 +274,35 @@
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<configuration name="KenCommandAPI [test]" type="GradleRunConfiguration" factoryName="Gradle" temporary="true">
<ExternalSystemSettings>
<option name="executionName" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="externalSystemIdString" value="GRADLE" />
<option name="scriptParameters" value="" />
<option name="taskDescriptions">
<list />
</option>
<option name="taskNames">
<list>
<option value="test" />
</list>
</option>
<option name="vmOptions" />
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Gradle.KenCommandAPI [test]" />
<item itemvalue="Gradle.KenCommandAPI [clean test]" />
<item itemvalue="Gradle.CommandParserTest.checkArgumentExpected" />
<item itemvalue="Gradle.KenCommandAPI [publish]" />
<item itemvalue="Gradle.KenCommandAPI [publishAllPublicationsToScrowRepository]" />
<item itemvalue="Gradle.KenCommandAPI [build]" />
<item itemvalue="Gradle.KenCommandAPI [buildEnvironment]" />
<item itemvalue="Gradle.KenCommandAPI [clean]" />
</list>
</recent_temporary>
</component>

View file

@ -1,5 +1,5 @@
group = "de.kentoj.scrow"
version = "0.31"
version = "0.32"
subprojects {
group = rootProject.group

View file

@ -10,9 +10,24 @@ repositories {
}
dependencies {
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api
testImplementation("org.junit.jupiter:junit-jupiter-api:6.1.1")
// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine
testImplementation("org.junit.jupiter:junit-jupiter-engine:6.1.1")
// https://mvnrepository.com/artifact/org.junit.platform/junit-platform-launcher
testImplementation("org.junit.platform:junit-platform-launcher:6.1.1")
testImplementation("net.kyori:adventure-api:5.2.0")
compileOnly("net.kyori:adventure-api:5.2.0")
}
tasks.test {
useJUnitPlatform()
testLogging {
showStandardStreams = true
}
}
publishing {
publications {
create<MavenPublication>("KenCommandAPI") {

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()));
}