dev.jorel.commandapi.AbstractArgumentTree Maven / Gradle / Ivy
package dev.jorel.commandapi;
import dev.jorel.commandapi.arguments.AbstractArgument;
import java.util.ArrayList;
import java.util.List;
/**
* This is a base class for arguments, allowing them to behave as tree nodes in
* a {@link AbstractCommandTree}
* @param The class extending this class, used as the return type for chain calls
* @param The CommandSender class used by the class extending this class
*/
public abstract class AbstractArgumentTree
/// @endcond
, Argument
/// @cond DOX
extends AbstractArgument, ?, Argument, CommandSender>
/// @endcond
, CommandSender> extends Executable {
final List> arguments = new ArrayList<>();
final Argument argument;
/**
* Instantiates an {@link AbstractArgumentTree}. This can only be called if the class
* that extends this is an {@link AbstractArgument}
*/
@SuppressWarnings("unchecked")
protected AbstractArgumentTree() {
if (this instanceof AbstractArgument, ?, Argument, CommandSender>) {
this.argument = (Argument) this;
} else {
throw new IllegalArgumentException("Implicit inherited constructor must be from Argument");
}
}
/**
* Instantiates an {@link AbstractArgumentTree} with an underlying argument.
*
* @param argument the argument to use as the underlying argument for this
* argument tree
*/
protected AbstractArgumentTree(final Argument argument) {
this.argument = argument;
// Copy the executor in case any executions were defined on the argument
this.executor = argument.executor;
}
/**
* Create a child branch on this node
*
* @param tree The child branch
* @return this tree node
*/
public Impl then(final AbstractArgumentTree, Argument, CommandSender> tree) {
this.arguments.add(tree);
return instance();
}
List> getExecutions() {
List> executions = new ArrayList<>();
// If this is executable, add its execution
if (this.executor.hasAnyExecutors()) {
executions.add(new Execution<>(List.of(this.argument), this.executor));
}
// Add all executions from all arguments
for (AbstractArgumentTree, Argument, CommandSender> tree : arguments) {
for (Execution execution : tree.getExecutions()) {
// Prepend this argument to the arguments of the executions
executions.add(execution.prependedBy(this.argument));
}
}
return executions;
}
}