package io.dico.dicore.command; import io.dico.dicore.command.chat.IChatHandler; import io.dico.dicore.command.parameter.ArgumentBuffer; import io.dico.dicore.command.parameter.ParameterList; import io.dico.dicore.command.predef.PredefinedCommand; import org.bukkit.command.CommandSender; import java.util.Collection; import java.util.List; import java.util.Map; /** * Interface for an address of a command. *
* The address holds what the name and aliases of a command are. * The address also (optionally) holds a reference to a {@link Command} *
* One instance of {@link Command} can be held by multiple addresses, * because the address decides what the command's name and aliases are. *
* The address holds children by key in a map. This map's keys include aliases for its children. * This creates a tree of addresses. If a command is dispatches, the tree is traversed untill a command is found * and no children deeper down match the command (there are exceptions to the later as defined by * {@link Command#takePrecedenceOverSubcommand(String, ArgumentBuffer)} * and {@link Command#isVisibleTo(CommandSender)} */ public interface ICommandAddress { /** * @return true if this address has a parent. */ boolean hasParent(); /** * Get the parent of this address * * @return the parent of this address, or null if none exists. */ ICommandAddress getParent(); /** * @return true if this address has a command. */ boolean hasCommand(); /** * @return true if this address has a command that is not an instance of {@link PredefinedCommand} */ boolean hasUserDeclaredCommand(); /** * @return Get the command of this address, or null if none exists. */ Command getCommand(); /** * @return true if this address is an instance of {@link RootCommandAddress} */ boolean isRoot(); /** * @return the root address of the tree which this address resides in. */ ICommandAddress getRoot(); /** * A list of the names of this address, at the current level. * The first entry is the main key, the subsequent ones are aliases. *
* Untill an address is assigned a parent, this list is mutable. *
* If {@link #isRoot()}, this returns an immutable, empty list.
*
* @return the list of names.
*/
List
* To iterate children without duplicates, you can do something like this:
* {@code
* for (String key : address.getChildrenMainKeys()) {
* ICommandAddress child = address.getChild(key);
* // do stuff with child
* }
* }
*
* The default implementation is as follows: *
{@code * return buffer.hasNext() ? getChild(buffer.next()) : null; * }* * @param context context of a command being executed * @param buffer the buffer. The name or alias of a command. * @return the child, or null if it's not found, altered freely by the implementation */ ICommandAddress getChild(ExecutionContext context, ArgumentBuffer buffer) throws CommandException; /** * Get the command dispatcher for this tree * * @return the command dispatcher */ ICommandDispatcher getDispatcherForTree(); /** * @return The desired chathandler for use by commands at this address and any sub-addresses, if they define no explicit chat handler. */ IChatHandler getChatHandler(); /** * Returns if the command attached to this address should be treated as trailing. * A trailing command is executed whenever the address is scanned for children. * Its parameters are parsed and added to the context. * * @return true if the command attached to this address should be treated as trailing. */ boolean isCommandTrailing(); static ICommandAddress newChild() { return new ChildCommandAddress(); } static ICommandAddress newChild(Command command) { return new ChildCommandAddress(command); } static ICommandAddress newRoot() { return new RootCommandAddress(); } }