package io.gitlab.jfronny.glaunch.gson; import com.google.gson.*; import io.gitlab.jfronny.glaunch.model.MinecraftArgument; import io.gitlab.jfronny.glaunch.model.Rules; import java.lang.reflect.Type; import java.util.LinkedHashSet; import java.util.Set; public class MinecraftArgumentDeserializer implements JsonDeserializer { @Override public MinecraftArgument deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.isJsonPrimitive() && json.getAsJsonPrimitive().isString()) { return new MinecraftArgument(Set.of(json.getAsString())); } else if (json.isJsonObject()) { JsonObject jo = json.getAsJsonObject(); if (jo.size() != 2 || !jo.has("rules") || !jo.has("value")) throw new JsonParseException("Not a valid minecraft argument"); Rules r = context.deserialize(jo.get("rules"), Rules.class); if (!r.allow()) return new MinecraftArgument(Set.of()); Set sel = new LinkedHashSet<>(); JsonElement value = jo.get("value"); if (value.isJsonArray()) { for (JsonElement val : value.getAsJsonArray()) { sel.add(val.getAsString()); } } else if (value.isJsonPrimitive()) sel.add(value.getAsString()); else throw new JsonParseException("Unexpected value type"); return new MinecraftArgument(Set.copyOf(sel)); } else throw new JsonParseException("Not a valid minecraft argument"); } }