package org.jtwig.render.expression.calculator;
import com.google.common.base.Optional;
import org.jtwig.exceptions.CalculationException;
import org.jtwig.model.expression.ComprehensionListExpression;
import org.jtwig.render.RenderRequest;
import org.jtwig.render.expression.CalculateExpressionService;
import org.jtwig.render.expression.calculator.enumerated.EnumerationListStrategy;
import org.jtwig.util.ErrorMessageFormatter;
import java.util.List;
public class ComprehensionListExpressionCalculator implements ExpressionCalculator<ComprehensionListExpression> {
@Override
public Object calculate(RenderRequest request, ComprehensionListExpression expression) {
CalculateExpressionService calculateExpressionService = request.getEnvironment().getRenderEnvironment().getCalculateExpressionService();
EnumerationListStrategy listEnumerationStrategy = request.getEnvironment().getListEnumerationStrategy();
Object startValue = calculateExpressionService.calculate(request, expression.getStart());
Object endValue = calculateExpressionService.calculate(request, expression.getEnd());
Optional<List<Object>> result = listEnumerationStrategy.enumerate(request, startValue, endValue);
if (result.isPresent()) {
return result.get();
} else {
throw new CalculationException(ErrorMessageFormatter.errorMessage(expression.getPosition(), String.format("Unable to calculate a list from a comprehension list starting with '%s' and ending with '%s'", startValue, endValue)));
}
}
}