package net.minecraft.command.type.custom.nbt;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.ParsingUtilities.PrimitiveCallback;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.ArgWrapper;
import net.minecraft.command.arg.CommandArg;
import net.minecraft.command.collections.TypeIDs;
import net.minecraft.command.parser.MatcherRegistry;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.management.TypeID;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagByte;
import net.minecraft.nbt.NBTTagDouble;
import net.minecraft.nbt.NBTTagFloat;
import net.minecraft.nbt.NBTTagInt;
import net.minecraft.nbt.NBTTagLong;
import net.minecraft.nbt.NBTTagShort;
import net.minecraft.nbt.NBTTagString;
public final class NBTUtilities
{
public final static MatcherRegistry numberIDMatcher = new MatcherRegistry(Pattern.compile("\\G\\s*+([bsilfd])", Pattern.CASE_INSENSITIVE));
public static Set<TypeID<? extends Number>> primitiveTypes = new HashSet<TypeID<? extends Number>>(Arrays.asList(TypeIDs.Byte, TypeIDs.Short, TypeIDs.Integer, TypeIDs.Long, TypeIDs.Float, TypeIDs.Double));
private NBTUtilities()
{
}
public static CommandArg<NBTBase> getTagByte(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagByte eval(final ICommandSender sender) throws CommandException
{
return new NBTTagByte(((Number) toConvert.arg().eval(sender)).byteValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Byte> arg = toConvert.iConvertTo(parser, TypeIDs.Byte);
@Override
public NBTTagByte eval(final ICommandSender sender) throws CommandException
{
return new NBTTagByte(this.arg.eval(sender));
}
};
}
public static CommandArg<NBTBase> getTagShort(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagShort eval(final ICommandSender sender) throws CommandException
{
return new NBTTagShort(((Number) toConvert.arg().eval(sender)).shortValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Short> arg = toConvert.iConvertTo(parser, TypeIDs.Short);
@Override
public NBTTagShort eval(final ICommandSender sender) throws CommandException
{
return new NBTTagShort(this.arg.eval(sender));
}
};
}
public static CommandArg<NBTBase> getTagInt(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagInt eval(final ICommandSender sender) throws CommandException
{
return new NBTTagInt(((Number) toConvert.arg().eval(sender)).intValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Integer> arg = toConvert.iConvertTo(parser, TypeIDs.Integer);
@Override
public NBTTagInt eval(final ICommandSender sender) throws CommandException
{
return new NBTTagInt(this.arg.eval(sender));
}
};
}
public static CommandArg<NBTBase> getTagLong(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagLong eval(final ICommandSender sender) throws CommandException
{
return new NBTTagLong(((Number) toConvert.arg().eval(sender)).longValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Long> arg = toConvert.iConvertTo(parser, TypeIDs.Long);
@Override
public NBTTagLong eval(final ICommandSender sender) throws CommandException
{
return new NBTTagLong(this.arg.eval(sender));
}
};
}
public static CommandArg<NBTBase> getTagFloat(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagFloat eval(final ICommandSender sender) throws CommandException
{
return new NBTTagFloat(((Number) toConvert.arg().eval(sender)).floatValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Float> arg = toConvert.iConvertTo(parser, TypeIDs.Float);
@Override
public NBTTagFloat eval(final ICommandSender sender) throws CommandException
{
return new NBTTagFloat(this.arg.eval(sender));
}
};
}
public static CommandArg<NBTBase> getTagDouble(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
if (primitiveTypes.contains(toConvert.type))
return new CommandArg<NBTBase>()
{
@Override
public NBTTagDouble eval(final ICommandSender sender) throws CommandException
{
return new NBTTagDouble(((Number) toConvert.arg().eval(sender)).doubleValue());
}
};
return new CommandArg<NBTBase>()
{
private final CommandArg<Double> arg = toConvert.iConvertTo(parser, TypeIDs.Double);
@Override
public NBTTagDouble eval(final ICommandSender sender) throws CommandException
{
return new NBTTagDouble(this.arg.eval(sender));
}
};
}
public static abstract class NBTData implements PrimitiveCallback<String>
{
public abstract void put(NBTBase data);
public abstract void add(CommandArg<NBTBase> data);
@Override
public CommandArg<String> call(final Parser parser, final String s) throws SyntaxErrorException
{
final Matcher m = parser.getMatcher(numberIDMatcher);
if (parser.findInc(m))
try
{
switch (m.group(1).charAt(0))
{
case 'b':
this.put(new NBTTagByte(Byte.parseByte(s)));
return null;
case 's':
this.put(new NBTTagShort(Short.parseShort(s)));
return null;
case 'i':
this.put(new NBTTagInt(Integer.parseInt(s)));
return null;
case 'l':
this.put(new NBTTagLong(Long.parseLong(s)));
return null;
case 'f':
this.put(new NBTTagFloat(Float.parseFloat(s)));
return null;
case 'd':
this.put(new NBTTagDouble(Double.parseDouble(s)));
return null;
}
} catch (final NumberFormatException ex)
{
throw parser.SEE(ex.getMessage());
}
this.put(new NBTTagString(s));
return null;
}
}
public static CommandArg<NBTBase> procIdentifier(final Parser parser, final ArgWrapper<?> toConvert) throws SyntaxErrorException
{
final Matcher m = parser.getMatcher(numberIDMatcher);
if (parser.findInc(m))
switch (m.group(1).charAt(0))
{
case 'b':
return getTagByte(parser, toConvert);
case 's':
return getTagShort(parser, toConvert);
case 'i':
return getTagInt(parser, toConvert);
case 'l':
return getTagLong(parser, toConvert);
case 'f':
return getTagFloat(parser, toConvert);
case 'd':
return getTagDouble(parser, toConvert);
}
return toConvert.iConvertTo(parser, TypeIDs.NBTBase);
}
}