package com.hubspot.jinjava.lib.fn;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.google.common.collect.ImmutableMap;
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
import com.hubspot.jinjava.el.ext.AstDict;
import com.hubspot.jinjava.el.ext.AstList;
import com.hubspot.jinjava.el.ext.AstTuple;
import com.hubspot.jinjava.objects.date.PyishDate;
@JinjavaDoc(
value = "Get a string that describes the type of the object, similar to Python's type()")
public class TypeFunction {
private static Map<Class<?>, String> CLASS_TYPE_TO_NAME = ImmutableMap.<Class<?>, String>builder()
.put(AstDict.class, "dict")
.put(AstList.class, "list")
.put(AstTuple.class, "tuple")
.put(Boolean.class, "bool")
.put(PyishDate.class, "datetime")
.put(ZonedDateTime.class, "datetime")
.build();
private static Map<Class<?>, String> ASSIGNABLE_TYPE_TO_NAME = ImmutableMap.<Class<?>, String>builder()
.put(Boolean.class, "bool")
.put(Double.class, "float")
.put(Float.class, "float")
.put(Integer.class, "int")
.put(List.class, "list")
.put(Long.class, "long")
.put(Map.class, "dict")
.put(String.class, "str")
.build();
public static String type(Object var) {
if (var == null) {
return "null";
}
for (Entry<Class<?>, String> entry : CLASS_TYPE_TO_NAME.entrySet()) {
if (var.getClass() == entry.getKey()) {
return entry.getValue();
}
}
for (Entry<Class<?>, String> entry : ASSIGNABLE_TYPE_TO_NAME.entrySet()) {
if (entry.getKey().isAssignableFrom(var.getClass())) {
return entry.getValue();
}
}
return "unknown";
}
}