package org.jtwig.render.expression.calculator.operation.binary; import com.google.common.base.Optional; import org.jtwig.model.expression.BinaryOperationExpression; import org.jtwig.render.RenderRequest; import org.jtwig.render.expression.calculator.operation.binary.calculators.BinaryOperationCalculator; import org.jtwig.util.ErrorMessageFormatter; public class BinaryOperationService { private final BinaryOperationCalculatorSelector binaryOperationCalculatorSelector; public BinaryOperationService(BinaryOperationCalculatorSelector binaryOperationCalculatorSelector) { this.binaryOperationCalculatorSelector = binaryOperationCalculatorSelector; } public Object calculate(RenderRequest request, BinaryOperationExpression expression) { BinaryOperator binaryOperator = expression.getBinaryOperator(); Optional<BinaryOperationCalculator> optional = binaryOperationCalculatorSelector.calculatorFor(binaryOperator); if (optional.isPresent()) { return optional.get().calculate(new BinaryOperationCalculator.Request(request, expression.getPosition(), expression.getLeftOperand(), expression.getRightOperand())); } else { throw new IllegalArgumentException(ErrorMessageFormatter.errorMessage(expression.getPosition(), String.format("No calculator implementation for operation '%s'", binaryOperator.getClass()))); } } }