java-commons/muscript/src/main/java/io/gitlab/jfronny/muscript/data/dynamic/additional/DirectPreconditionVisitor.java

48 lines
2.3 KiB
Java

package io.gitlab.jfronny.muscript.data.dynamic.additional;
import io.gitlab.jfronny.muscript.ast.*;
import io.gitlab.jfronny.muscript.ast.dynamic.*;
import io.gitlab.jfronny.muscript.ast.literal.*;
import io.gitlab.jfronny.muscript.ast.string.Concatenate;
import io.gitlab.jfronny.muscript.data.dynamic.*;
import java.util.Set;
public class DirectPreconditionVisitor {
public static boolean visit(Expr<?> expr) {
//TODO replace this with switch pattern matching
if (expr instanceof BoolLiteral) return true;
if (expr instanceof NullLiteral) return true;
if (expr instanceof NumberLiteral) return true;
if (expr instanceof StringLiteral) return true;
if (expr instanceof DynamicLiteral<?> e) return visit(e.value);
if (expr instanceof DynamicCoerce e) return visit(e.inner);
if (expr instanceof ObjectLiteral e) return e.content.values().stream().allMatch(DirectPreconditionVisitor::visit);
if (expr instanceof Concatenate e) return visit(e.left) && visit(e.right);
// if (expr instanceof BoolUnpack e) return visit(e.inner);
// if (expr instanceof NumberUnpack e) return visit(e.inner);
// if (expr instanceof StringUnpack e) return visit(e.inner);
if (expr instanceof Bind e) return visitCallable(e.callable) && visit(e.parameter);
if (expr instanceof Call e) return visitCallable(e.left) && e.args.stream().allMatch(a -> !a.variadic() && visit(a.expr()));
return false; // unknown expression
}
public static boolean visit(Dynamic dynamic) {
if (dynamic instanceof DNull) return true;
if (dynamic instanceof DFinal.FImpl) {
if (dynamic instanceof DBool) return true;
if (dynamic instanceof DNumber) return true;
if (dynamic instanceof DString) return true;
if (dynamic instanceof DObject ob) return ob.getValue().values().stream().allMatch(DirectPreconditionVisitor::visit);
if (dynamic instanceof DList ob) return ob.getValue().stream().allMatch(DirectPreconditionVisitor::visit);
}
return false;
}
private static final Set<String> allowedVariables = Set.of("date", "time", "enum", "listOf");
private static boolean visitCallable(DynamicExpr expr) {
if (expr instanceof Variable v) return allowedVariables.contains(v.name);
return false;
}
}