package com.hubspot.jinjava.el.ext;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import javax.el.ELContext;
import com.hubspot.jinjava.interpret.TemplateStateException;
import com.hubspot.jinjava.objects.collections.PyMap;
import de.odysseus.el.tree.Bindings;
import de.odysseus.el.tree.impl.ast.AstIdentifier;
import de.odysseus.el.tree.impl.ast.AstLiteral;
import de.odysseus.el.tree.impl.ast.AstNode;
import de.odysseus.el.tree.impl.ast.AstString;
public class AstDict extends AstLiteral {
private final Map<AstNode, AstNode> dict;
public AstDict(Map<AstNode, AstNode> dict) {
this.dict = dict;
}
@Override
public Object eval(Bindings bindings, ELContext context) {
Map<String, Object> resolved = new LinkedHashMap<>();
for (Map.Entry<AstNode, AstNode> entry : dict.entrySet()) {
String key;
if (entry.getKey() instanceof AstString) {
key = Objects.toString(entry.getKey().eval(bindings, context));
} else if (entry.getKey() instanceof AstIdentifier) {
key = ((AstIdentifier) entry.getKey()).getName();
} else {
throw new TemplateStateException("Dict key must be a string or identifier, was: " + entry.getKey());
}
resolved.put(key, entry.getValue().eval(bindings, context));
}
return new PyMap(resolved);
}
@Override
public void appendStructure(StringBuilder builder, Bindings bindings) {
throw new UnsupportedOperationException("appendStructure not implemented in " + getClass().getSimpleName());
}
@Override
public String toString() {
StringBuilder s = new StringBuilder("{");
for (Map.Entry<AstNode, AstNode> entry : dict.entrySet()) {
s.append(Objects.toString(entry.getKey())).append(":").append(Objects.toString(entry.getValue()));
}
return s.append("}").toString();
}
}