package org.jtwig.render.expression.calculator; import com.google.common.base.Optional; import com.google.common.base.Supplier; import org.jtwig.exceptions.CalculationException; import org.jtwig.functions.FunctionArguments; import org.jtwig.functions.resolver.FunctionResolver; import org.jtwig.model.expression.FunctionExpression; import org.jtwig.render.RenderRequest; import org.jtwig.util.ErrorMessageFormatter; public class FunctionExpressionCalculator implements ExpressionCalculator<FunctionExpression> { private final FunctionArgumentsFactory functionArgumentsFactory; public FunctionExpressionCalculator(FunctionArgumentsFactory functionArgumentsFactory) { this.functionArgumentsFactory = functionArgumentsFactory; } @Override public Object calculate(RenderRequest request, FunctionExpression expression) { FunctionResolver functionResolver = request.getEnvironment().getFunctionResolver(); FunctionArguments arguments = functionArgumentsFactory.create(request, expression.getArguments()); Optional<Supplier<Object>> functionExecutor = functionResolver.resolve(request, expression.getPosition(), expression.getFunctionIdentifier(), arguments); if (functionExecutor.isPresent()) { return functionExecutor.get().get(); } else { throw new CalculationException(ErrorMessageFormatter.errorMessage(expression.getPosition(), String.format("Unable to resolve function '%s' with arguments %s", expression.getFunctionIdentifier(), arguments.getValues()))); } } }