package net.demilich.metastone.game.cards.desc; import java.lang.reflect.Type; import java.util.Map; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import net.demilich.metastone.game.spells.desc.source.CardSource; import net.demilich.metastone.game.spells.desc.source.SourceArg; import net.demilich.metastone.game.spells.desc.source.SourceDesc; public class SourceDeserializer implements JsonDeserializer<SourceDesc> { @SuppressWarnings("unchecked") @Override public SourceDesc deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException { if (!(json instanceof JsonObject)) { throw new JsonParseException("ValueProvider parser expected an JsonObject but found " + json + " instead"); } JsonObject jsonData = (JsonObject) json; String cardSourceClassName = CardSource.class.getPackage().getName() + "." + jsonData.get("class").getAsString(); Class<? extends CardSource> cardSourceClass; try { cardSourceClass = (Class<? extends CardSource>) Class.forName(cardSourceClassName); } catch (ClassNotFoundException e) { e.printStackTrace(); throw new JsonParseException("ValueProvider parser encountered an invalid class: " + cardSourceClassName); } Map<SourceArg, Object> arguments = SourceDesc.build(cardSourceClass); // parseArgument(SourceArg.VALUE, jsonData, arguments, ParseValueType.INTEGER); parseArgument(SourceArg.TARGET_PLAYER, jsonData, arguments, ParseValueType.TARGET_PLAYER); // parseArgument(SourceArg.ATTRIBUTE, jsonData, arguments, ParseValueType.ATTRIBUTE); // parseArgument(SourceArg.RACE, jsonData, arguments, ParseValueType.RACE); // parseArgument(SourceArg.OPERATION, jsonData, arguments, ParseValueType.OPERATION); parseArgument(SourceArg.INVERT, jsonData, arguments, ParseValueType.BOOLEAN); // parseArgument(SourceArg.CARD_TYPE, jsonData, arguments, ParseValueType.CARD_TYPE); // parseArgument(SourceArg.HERO_CLASS, jsonData, arguments, ParseValueType.HERO_CLASS); // parseArgument(SourceArg.HERO_CLASSES, jsonData, arguments, ParseValueType.HERO_CLASS_ARRAY); // parseArgument(SourceArg.RARITY, jsonData, arguments, ParseValueType.RARITY); // parseArgument(SourceArg.MANA_COST, jsonData, arguments, ParseValueType.VALUE); // parseArgument(SourceArg.CARD_ID, jsonData, arguments, ParseValueType.STRING); // parseArgument(SourceArg.FILTERS, jsonData, arguments, ParseValueType.ENTITY_FILTER_ARRAY); // parseArgument(SourceArg.TARGET, jsonData, arguments, ParseValueType.TARGET_REFERENCE); return new SourceDesc(arguments); } private void parseArgument(SourceArg arg, JsonObject jsonData, Map<SourceArg, Object> arguments, ParseValueType valueType) { String argName = ParseUtils.toCamelCase(arg.toString()); if (!jsonData.has(argName)) { return; } Object value = ParseUtils.parse(argName, jsonData, valueType); arguments.put(arg, value); } }