This commit is contained in:
kento2 2026-07-05 23:28:41 +02:00
parent 76f4ba2ec9
commit ac804b6c5b
13 changed files with 140 additions and 95 deletions

View file

@ -1,9 +1,8 @@
plugins {
id("java")
id("maven-publish")
id("de.kentoj.scrow.scrow-repository")
id("de.kentoj.scrow.base-dependencies")
id("de.kentoj.scrow.java-library")
id("scrow.scrow-publish")
id("scrow.base-dependencies")
id("scrow.java-library")
}
repositories {

View file

@ -47,9 +47,9 @@ public class CommandHandler<T> {
String filter = null;
if (parseResult instanceof ParseResult.UnknownLiteral<T>)
filter = ((ParseResult.UnknownLiteral<T>) parseResult).getName();
filter = ((ParseResult.UnknownLiteral<T>) parseResult).getInput();
else if (parseResult instanceof ParseResult.NoPermission<T>)
filter = ((ParseResult.NoPermission<T>) parseResult).getName();
filter = ((ParseResult.NoPermission<T>) parseResult).getInput();
return getSuggestions(sender, parseResult.getLiteral(), filter);
}

View file

@ -17,7 +17,7 @@ public interface CommandArgument<T, V> {
ArgumentType<T, V> getType();
void setDefaultValueProvider(@Nullable Function<T, V> getDefaultValueProvider);
void setDefaultValueProvider(@Nullable Function<T, V> defaultValueProvider);
@Nullable Function<T, V> getDefaultValueProvider();

View file

@ -4,9 +4,9 @@ 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.platform.HasPermissionMethod;
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;
@ -62,36 +62,41 @@ public class CommandParser<T> {
T sender,
boolean parseArgs
) {
Object value;
if (args.hasNext()) {
var argStr = getRawArgument(args, nodeArg);
if (!parseArgs) {
value = null;
} else {
try {
value = nodeArg.getType().parseInput(argStr);
} catch (IllegalArgumentException ex) {
return Results.failure(new ParseResult.IllegalArgument<>(node, nodeArg, ex.getMessage(), argStr));
}
}
} else {
if (!args.hasNext()) {
if (nodeArg.getDefaultValueProvider() == null)
return Results.failure(new ParseResult.ArgumentExpected<>(node, nodeArg));
value = nodeArg.getDefaultValueProvider().apply(sender);
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<T, Object>) nodeArg);
return Results.success(parsedArg);
}
@SuppressWarnings("unchecked")
private ParsedArgument<T, Object> toParsed(Object value, CommandArgument<T, ?> arg) {
return new ParsedArgumentImpl<>(value, (CommandArgument<T, Object>) arg);
}
private String getRawArgument(Iterator<String> args, CommandArgument<T, ?> 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());
}

View file

@ -35,11 +35,11 @@ public abstract sealed class ParseResult<T> permits ParseResult.IllegalArgument,
public static final class UnknownLiteral<T> extends ParseResult<T> {
private final CommandNode<T> previousLiteral;
@Getter
private final String name;
private final String input;
@Override
public String getMessage() {
return "Unknown subcommand: " + name;
return "Unknown subcommand: " + input;
}
@Override
@ -77,11 +77,11 @@ public abstract sealed class ParseResult<T> permits ParseResult.IllegalArgument,
@Getter
private final CommandNode<T> literal;
@Getter
private final String name;
private final String input;
@Override
public String getMessage() {
return "Unknown subcommand: " + name;
return "Unknown subcommand: " + input;
}
}

View file

@ -6,7 +6,7 @@ import java.util.concurrent.CompletableFuture;
public interface SuggestionProvider<T> {
/**
* @return an unfiltered(no permission checks or filtering by input) list of strings that may be used for the argument
* @return an unfiltered(no permission checks or filtering by input) list of strings that may be used for the argument/literal
*/
List<String> suggest(T sender);
}

View file

@ -21,8 +21,7 @@ public class CommandArgumentImpl<T, V> implements CommandArgument<T, V> {
@Getter
@Setter
private @Nullable Function<T, V> defaultValueProvider;
private @Nullable Function<T, V> defaultValueProvider = null;
@Setter
private @Nullable SuggestionProvider<T> suggestionProvider;