package io.gitlab.jfronny.respackopts.gson; import io.gitlab.jfronny.gson.*; import io.gitlab.jfronny.muscript.StarScriptIngester; import io.gitlab.jfronny.muscript.ast.Expr; import io.gitlab.jfronny.muscript.compiler.Parser; import io.gitlab.jfronny.respackopts.muscript.ScopeVersion; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; public class ExprDeserializer implements JsonDeserializer> { private static final Map> compiledScripts = new HashMap<>(); @Override public Expr deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { if (json.isJsonPrimitive() && json.getAsJsonPrimitive().isString()) { String s = json.getAsJsonPrimitive().getAsString(); if (compiledScripts.containsKey(s)) return compiledScripts.get(s); try { int v = AttachmentHolder.getAttachedVersion(); Expr expr = Parser.parse(ScopeVersion.by(v).muScriptVersion, v <= 7 ? StarScriptIngester.starScriptToMu(s) : s); compiledScripts.put(s, expr); return expr; } catch (Parser.ParseException e) { throw new JsonParseException("Could not create script", e); } } else { if (json.isJsonObject()) throw new JsonParseException("Could not parse script: Expected string but got object (did you forget to migrate this rpo to muScript?)"); throw new JsonParseException("Could not parse script: Expected string"); } } }