Respackopts/src/main/java/io/gitlab/jfronny/respackopts/gson/ExprDeserializer.java

39 lines
1.7 KiB
Java

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<Expr<?>> {
private static final Map<String, Expr<?>> 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");
}
}
}