package org.mafagafogigante.dungeon.commands;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
/**
* Allows processing of IssuedCommands to produce PreparedIssuedCommands.
*/
public class IssuedCommandProcessor {
private IssuedCommandProcessor() {
throw new AssertionError();
}
/**
* Evaluates an IssuedCommand. This method will check if the IssuedCommand is valid or not and provide suggestions if
* it is not.
*/
public static IssuedCommandEvaluation evaluateIssuedCommand(@NotNull IssuedCommand issuedCommand) {
CommandSet collection;
String commandToken;
if (issuedCommand.getTokens().size() > 1 && CommandSets.hasCommandSet(issuedCommand.getTokens().get(0))) {
collection = CommandSets.getCommandSet(issuedCommand.getTokens().get(0));
commandToken = issuedCommand.getTokens().get(1);
} else {
collection = CommandSets.getCommandSet("default");
commandToken = issuedCommand.getTokens().get(0);
}
// At this point. Both collection and commandToken are not null.
if (collection.getCommand(commandToken) == null) {
return new IssuedCommandEvaluation(false, collection.getClosestCommands(commandToken));
} else {
return new IssuedCommandEvaluation(true, Collections.<String>emptyList());
}
}
/**
* Prepares an IssuedCommand. As a precondition, evaluateIssueCommand should have considered this IssuedCommand
* valid.
*/
public static PreparedIssuedCommand prepareIssuedCommand(@NotNull IssuedCommand issuedCommand) {
CommandSet collection;
String commandToken;
int indexOfFirstArgument;
if (issuedCommand.getTokens().size() > 1 && CommandSets.hasCommandSet(issuedCommand.getTokens().get(0))) {
collection = CommandSets.getCommandSet(issuedCommand.getTokens().get(0));
commandToken = issuedCommand.getTokens().get(1);
indexOfFirstArgument = 2;
} else {
collection = CommandSets.getCommandSet("default");
commandToken = issuedCommand.getTokens().get(0);
indexOfFirstArgument = 1;
}
String[] arguments = makeArgumentArray(issuedCommand, indexOfFirstArgument);
Command selectedCommand = collection.getCommand(commandToken);
return new PreparedIssuedCommand(selectedCommand, arguments);
}
private static String[] makeArgumentArray(IssuedCommand issuedCommand, int indexOfFirstArgument) {
String[] tokenArray = issuedCommand.getTokens().toArray(new String[issuedCommand.getTokens().size()]);
int argumentCount = issuedCommand.getTokens().size() - indexOfFirstArgument;
String[] arguments = new String[issuedCommand.getTokens().size() - indexOfFirstArgument];
System.arraycopy(tokenArray, indexOfFirstArgument, arguments, 0, argumentCount);
return arguments;
}
}