package org.jtwig.util;
import org.jtwig.exceptions.CalculationException;
import org.jtwig.functions.FunctionRequest;
import org.jtwig.value.WrappedCollection;
import org.jtwig.value.convert.Converter;
import java.math.BigDecimal;
import java.util.Collection;
public class FunctionValueUtils {
private static final String NUMBER_TYPE = "number";
private static final String COLLECTION_TYPE = "collection of objects";
public static String getString (FunctionRequest request, int position) {
return request.getEnvironment().getValueEnvironment().getStringConverter().convert(request.get(position));
}
public static BigDecimal getNumber (FunctionRequest request, int position) {
Converter<BigDecimal> converter = request.getEnvironment().getValueEnvironment().getNumberConverter();
return convert(converter, NUMBER_TYPE, request, position);
}
public static Collection<Object> getCollection (FunctionRequest request, int position) {
Converter<WrappedCollection> collectionConverter = request.getEnvironment().getValueEnvironment().getCollectionConverter();
return convert(collectionConverter, COLLECTION_TYPE, request, position).values();
}
private static <T> T convert(Converter<T> converter, String typeName, FunctionRequest request, int position) {
Object value = request.get(position);
Converter.Result<T> result = converter.convert(value);
if (result.isDefined()) {
return result.get();
} else {
throw new CalculationException(ErrorMessageFormatter.errorMessage(request.getPosition(), String.format("Error converting argument with index %d ('%s' of type '%s') to %s", position, value, getType(value), typeName)));
}
}
private static Object getType(Object value) {
if (value == null) return null;
return value.getClass();
}
}