package envoy.client.data.commands; import java.util.*; import java.util.function.*; /** * This class is the base class of all {@code SystemCommands} and contains an * action and a number of arguments that should be used as input for this * function. * No {@code SystemCommand} can return anything. * Every {@code SystemCommand} must have as argument type {@code List} so * that the words following the indicator String can be used as input of the * function. This approach has one limitation:
* Order matters! Changing the order of arguments will likely result in * unexpected behavior. * * @author Leon Hofmeister * @since Envoy Client v0.2-beta */ public final class SystemCommand implements OnCall { protected int relevance; /** * The argument count of the command. */ protected final int numberOfArguments; /** * This function takes a {@code List} as argument because automatically * {@code SystemCommand#numberOfArguments} words following the necessary command * will be put into this list. * * @see String#split(String) */ protected final Consumer> action; protected final String description; protected final List defaults; /** * Constructs a new {@code SystemCommand}. * * @param action the action performed by the command * @param numberOfArguments the argument count accepted by the action * @param defaults the default values for the corresponding arguments * @param description the description of this {@code SystemCommand} * @since Envoy Client v0.2-beta */ public SystemCommand(Consumer> action, int numberOfArguments, List defaults, String description) { this.numberOfArguments = numberOfArguments; this.action = action; this.defaults = defaults == null ? new ArrayList<>() : defaults; this.description = description; } /** * @return the action that should be performed * @since Envoy Client v0.2-beta */ public Consumer> getAction() { return action; } /** * @return the argument count of the command * @since Envoy Client v0.2-beta */ public int getNumberOfArguments() { return numberOfArguments; } /** * @return the description * @since Envoy Client v0.2-beta */ public String getDescription() { return description; } /** * @return the relevance * @since Envoy Client v0.2-beta */ public int getRelevance() { return relevance; } /** * @param relevance the relevance to set * @since Envoy Client v0.2-beta */ public void setRelevance(int relevance) { this.relevance = relevance; } /** * Increments the relevance of this {@code SystemCommand}. */ @Override public void onCall() { relevance++; } /** * Increments the relevance of this {@code SystemCommand} and executes the * supplier. */ @Override public void onCall(Supplier consumer) { onCall(); consumer.get(); } /** * @return the defaults * @since Envoy Client v0.2-beta */ public List getDefaults() { return defaults; } @Override public int hashCode() { return Objects.hash(action); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; final SystemCommand other = (SystemCommand) obj; return Objects.equals(action, other.action); } @Override public String toString() { return "SystemCommand [relevance=" + relevance + ", numberOfArguments=" + numberOfArguments + ", " + (action != null ? "action=" + action + ", " : "") + (description != null ? "description=" + description + ", " : "") + (defaults != null ? "defaults=" + defaults : "") + "]"; } }