package net.minecraft.command.type.custom.json;
import java.util.ArrayList;
import java.util.regex.Matcher;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import net.minecraft.command.CommandException;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.ParsingUtilities;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.CommandArg;
import net.minecraft.command.arg.PrimitiveParameter;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.custom.json.JsonUtilities.JsonData;
public class ParserJsonArray
{
private final JsonDescriptor.Array descriptor;
public ParserJsonArray(final JsonDescriptor.Array descriptor)
{
this.descriptor = descriptor;
}
public static class ArrayData extends JsonData
{
public final JsonArray node = new JsonArray();
public final ArrayList<CommandArg<JsonElement>> data = new ArrayList<>();
public ArrayData(final JsonData data)
{
super(data);
}
@Override
public void put(final JsonElement json)
{
if (this.data.isEmpty())
this.node.add(json);
else
this.data.add(new PrimitiveParameter<>(json));
}
@Override
public void add(final CommandArg<JsonElement> json)
{
this.data.add(json);
}
}
public void parse(final Parser parser, final JsonData parserData) throws SyntaxErrorException
{
ParsingUtilities.terminateCompletion(parser);
final ArrayData data = new ArrayData(parserData);
this.parseItems(parser, data);
if (data.data.isEmpty())
parserData.put(data.node, this.descriptor.type());
else
{
final ArrayList<CommandArg<JsonElement>> dynamicData = data.data;
dynamicData.trimToSize();
data.procCache();
final JsonArray json = data.node;
parserData.add(new CommandArg<JsonElement>()
{
@Override
public JsonElement eval(final ICommandSender sender) throws CommandException
{
final JsonArray ret = new JsonArray();
ret.addAll(json);
for (final CommandArg<JsonElement> item : dynamicData)
ret.add(item.eval(sender));
return ret;
}
});
}
}
public void parseItems(final Parser parser, final ArrayData data) throws SyntaxErrorException
{
final Matcher m = parser.getMatcher(ParsingUtilities.listEndMatcher);
for (int i = 0;; ++i)
{
if (parser.findInc(m)) // Because [Item1,Item2,] is valid... (or at least the output of NBTTagList.toString)
{
if (!"]".equals(m.group(1)))
throw parser.SEE("Unexpected '" + m.group(1) + "' ");
return;
}
this.descriptor.getElementDescriptor(i).getElementParser().parse(parser, data);
if (!parser.findInc(m))
throw parser.SEE("No delimiter found while parsing tag list ");
if ("]".equals(m.group(1)))
return;
if ("}".equals(m.group(1)))
throw parser.SEE("Unexpected '}' ");
}
}
}