package net.minecraft.command.descriptors;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.collections4.trie.PatriciaTrie;
import net.minecraft.command.IPermission;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.ArgWrapper;
import net.minecraft.command.arg.PermissionWrapper;
import net.minecraft.command.completion.ITabCompletion;
import net.minecraft.command.completion.TCDSet;
import net.minecraft.command.completion.TabCompletion;
import net.minecraft.command.parser.CompletionParser.CompletionData;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.IExParse;
import net.minecraft.command.type.IParse;
import net.minecraft.command.type.custom.KVPair;
import net.minecraft.command.type.custom.TypeSelectorContent;
import net.minecraft.command.type.management.TypeID;
public abstract class SelectorDescriptor<D extends SParserData>
{
private final Set<TypeID<?>> resultTypes;
private final IPermission permission;
private final KVPair<D> kvPair;
private final IParse<ArgWrapper<?>> contentParser;
public abstract void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData, final D data);
private final static PatriciaTrie<SelectorDescriptor<?>> selectors = new PatriciaTrie<>();
public static final Map<ITabCompletion, IPermission> selectorCompletions = new HashMap<>();
public SelectorDescriptor(final Set<TypeID<?>> resultTypes, final IPermission permission)
{
this.resultTypes = resultTypes;
this.permission = permission;
this.kvPair = new KVPair<D>(this);
this.contentParser = new TypeSelectorContent<D>(this);
}
public static final void clear()
{
selectors.clear();
selectorCompletions.clear();
}
public static void registerSelector(final String name, final SelectorDescriptor<?> descriptor)
{
if (selectors.put(name.toLowerCase(), descriptor) != null)
throw new IllegalArgumentException("Selector already registerd: " + name);
final ITabCompletion completion = name.length() == 1 ? new TabCompletion.SingleChar(name.charAt(0)) : new TabCompletion(name);
selectorCompletions.put(completion, descriptor.permission);
for (final TypeID<?> resultType : descriptor.resultTypes)
resultType.addSelector(completion, descriptor.permission);
}
public static void registerSelector(final String name, final List<String> aliases, final SelectorDescriptor<?> descriptor)
{
registerSelector(name, descriptor);
for (final String alias : aliases)
registerSelector(alias, descriptor);
}
public static final SelectorDescriptor<?> getDescriptor(final String name)
{
return selectors.get(name.toLowerCase());
}
public final Set<TypeID<?>> getResultTypes()
{
return Collections.unmodifiableSet(this.resultTypes);
}
public final <T> ArgWrapper<T> construct(final TypeID<T> target, final D data) throws SyntaxErrorException
{
// return this.resultType.convertTo(this.construct(unnamedParams, namedParams), target);
return this.construct(data).convertTo(data.parser, target);
}
public abstract ArgWrapper<?> construct(D data) throws SyntaxErrorException;
public abstract void parse(final Parser parser, final String key, final D data) throws SyntaxErrorException;
public abstract void parse(final Parser parser, final D data) throws SyntaxErrorException;
public IExParse<Void, D> getKVPair()
{
return this.kvPair;
}
public final ArgWrapper<?> parse(final Parser parser) throws SyntaxErrorException
{
return PermissionWrapper.wrap(this.contentParser.parse(parser), this.permission);
}
public abstract D newParserData(Parser parser);
public static void addAlias(final String name, final String... aliases)
{
final SelectorDescriptor<?> descriptor = getDescriptor(name);
for (final String alias : aliases)
registerSelector(alias, descriptor);
}
}