package net.minecraft.command.type.custom.json;
import java.lang.reflect.Type;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import net.minecraft.command.SyntaxErrorException;
import net.minecraft.command.arg.ArgWrapper;
import net.minecraft.command.arg.CommandArg;
import net.minecraft.command.parser.Context;
import net.minecraft.command.parser.Parser;
import net.minecraft.command.type.CTypeParse;
import net.minecraft.command.type.custom.json.JsonDescriptor.Element;
import net.minecraft.command.type.custom.json.JsonUtilities.DeserializationManager;
import net.minecraft.command.type.custom.json.JsonUtilities.JsonData;
import net.minecraft.command.type.management.TypeID;
public class TypeJson<T> extends CTypeParse<T>
{
private final Element baseDescriptor;
private final DeserializationManager manager;
private final Type type;
private final TypeID<T> typeID;
public TypeJson(final Element baseDescriptor, final DeserializationManager manager, final Type type, final TypeID<T> typeID)
{
this.baseDescriptor = baseDescriptor;
this.manager = manager;
this.type = type;
this.typeID = typeID;
}
@Override
public ArgWrapper<T> iParse(final Parser parser, final Context context) throws SyntaxErrorException
{
final ArgWrapper<T> ret = context.generalParse(parser, this.typeID);
if (ret != null)
return ret;
this.manager.initCache();
final JsonElementData data = new JsonElementData(this.manager);
this.baseDescriptor.getElementParser().parse(parser, data);
if (data.constElement == null)
return this.typeID.wrap(this.manager.<T> createCmdArg(data.dynamicElement, this.type));
try
{
return this.typeID.wrap(this.manager.<T> fromJsonUncached(data.constElement, this.type));
} catch (final JsonParseException ex)
{
throw parser.SEE("Could not parse JSON: " + ex.getMessage() + " ");
}
}
private static class JsonElementData extends JsonData
{
public JsonElement constElement = null;
public CommandArg<JsonElement> dynamicElement = null;
public JsonElementData(final DeserializationManager manager)
{
super(manager);
}
@Override
public void put(final JsonElement json)
{
this.constElement = json;
}
@Override
public void add(final CommandArg<JsonElement> data)
{
this.dynamicElement = data;
}
}
}