package net.minecraft.command.descriptors; import java.util.Set; import net.minecraft.command.IPermission; import net.minecraft.command.SyntaxErrorException; import net.minecraft.command.arg.ArgWrapper; import net.minecraft.command.arg.CommandArg; import net.minecraft.command.completion.TCDSet; import net.minecraft.command.completion.TabCompletion; import net.minecraft.command.completion.TabCompletionData; import net.minecraft.command.descriptors.SelectorDescriptorSingleArg.ParserDataSingleArg; import net.minecraft.command.parser.CompletionParser.CompletionData; import net.minecraft.command.parser.Parser; import net.minecraft.command.type.IDataType; import net.minecraft.command.type.management.TypeID; public class SelectorDescriptorSingleArg extends SelectorDescriptor<ParserDataSingleArg> { public static class ParserDataSingleArg extends SParserData { public ArgWrapper<?> arg; public ParserDataSingleArg(final Parser parser) { super(parser); } @Override public ArgWrapper<?> finalize(final ArgWrapper<?> selector) { return selector; } @Override public boolean requiresKey() { return false; } public ArgWrapper<?> getRequiredArg() throws SyntaxErrorException { if (this.arg == null) throw this.parser.SEE("Missing required argument for selector "); return this.arg; } public <T> CommandArg<T> getRequiredArg(final TypeID<T> type) throws SyntaxErrorException { return this.getRequiredArg().get(type); } } public static abstract class SingleArgConstructable { public abstract ArgWrapper<?> construct(ParserDataSingleArg data) throws SyntaxErrorException; } private final String key; private final TabCompletion keyCompletion; private final IDataType<?> arg; private final SingleArgConstructable constructable; public SelectorDescriptorSingleArg(final Set<TypeID<?>> resultTypes, final IPermission permission, final IDataType<?> arg, final SingleArgConstructable constructable) { super(resultTypes, permission); this.arg = arg; this.key = null; this.keyCompletion = null; this.constructable = constructable; } public SelectorDescriptorSingleArg(final Set<TypeID<?>> resultTypes, final IPermission permission, final String key, final IDataType<?> arg, final SingleArgConstructable constructable) { super(resultTypes, permission); this.arg = arg; this.key = key; this.keyCompletion = new TabCompletion(key); this.constructable = constructable; } @Override public void complete(final TCDSet tcDataSet, final Parser parser, final int startIndex, final CompletionData cData, final ParserDataSingleArg data) { if (this.key != null && data.arg == null) TabCompletionData.addToSet(tcDataSet, startIndex, cData, this.keyCompletion); } @Override public ArgWrapper<?> construct(final ParserDataSingleArg data) throws SyntaxErrorException { return this.constructable.construct(data); } @Override public void parse(final Parser parser, final String key, final ParserDataSingleArg data) throws SyntaxErrorException { if (!key.equals(this.key)) throw parser.SEE("Unknown key '" + key + "' "); data.arg = this.arg.parse(parser); } @Override public void parse(final Parser parser, final ParserDataSingleArg data) throws SyntaxErrorException { if (data.arg != null) throw parser.SEE("Selector has only one argument "); data.arg = this.arg.parse(parser); } @Override public ParserDataSingleArg newParserData(final Parser parser) { return new ParserDataSingleArg(parser); } }