package de.zonlykroks.advancedscripts.lexer; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import java.util.ArrayList; import java.util.List; import java.util.Set; public class ScriptSyntaxPacketParser { private ScriptSyntaxPacketParser() { throw new IllegalStateException("Utility class"); } private static final TokenType[] TOKEN_TYPES = TokenType.values(); private static void reset() { Operators.OPERATORS.clear(); Headers.HEADERS.clear(); VariablePrefixes.RPEFIXES.clear(); VariableSuffixes.SUFFIXES.clear(); Commands.COMMANDS.clear(); } public static synchronized void parse(String scriptSyntax) { reset(); JsonObject jsonObject = JsonParser.parseString(scriptSyntax).getAsJsonObject(); for (String key : jsonObject.keySet()) { JsonArray jsonElements = jsonObject.get(key).getAsJsonArray(); if (key.startsWith("@")) { parseSpecial(key, jsonElements); } else { parseCommand(key, jsonElements); } } } private static void parseCommand(String key, JsonArray value) { boolean repeating = value.get(0).getAsBoolean(); List> validArgumentTypes = new ArrayList<>(); for (int i = 1; i < value.size(); i++) { JsonArray parameters = value.get(i).getAsJsonArray(); List parameterTypes = new ArrayList<>(); for (JsonElement parameter : parameters) { parameterTypes.add(TOKEN_TYPES[parameter.getAsInt()]); } validArgumentTypes.add(parameterTypes); } Commands.COMMANDS.put(key, new Command(repeating, validArgumentTypes)); } private static void parseSpecial(String key, JsonArray value) { Set set; switch (key) { case "@operators": set = Operators.OPERATORS; break; case "@headers": set = Headers.HEADERS; break; case "@prefixes": set = VariablePrefixes.RPEFIXES; break; case "@suffixes": set = VariableSuffixes.SUFFIXES; break; default: return; } for (JsonElement element : value) { set.add(element.getAsString()); } } }