package org.jtwig.render.expression.calculator.operation.binary.calculators.selection;
import org.jtwig.exceptions.CalculationException;
import org.jtwig.property.selection.SelectionPropertyResolver;
import org.jtwig.property.selection.SelectionRequest;
import org.jtwig.property.selection.SelectionResult;
import org.jtwig.render.expression.calculator.operation.binary.calculators.BinaryOperationCalculator;
import org.jtwig.value.Undefined;
import static org.jtwig.util.ErrorMessageFormatter.errorMessage;
public class SelectionOperationCalculator implements BinaryOperationCalculator {
private final SelectionErrorMessageGenerator selectionErrorMessageGenerator;
public SelectionOperationCalculator(SelectionErrorMessageGenerator selectionErrorMessageGenerator) {
this.selectionErrorMessageGenerator = selectionErrorMessageGenerator;
}
@Override
public Object calculate(Request request) {
SelectionPropertyResolver selectionPropertyResolver = request.getEnvironment().getPropertyResolverEnvironment().getSelectionPropertyResolver();
SelectionResult result = selectionPropertyResolver.resolve(new SelectionRequest(
request.getRenderContext(), request.getEnvironment(),
request.getLeftOperand(),
request.getRightOperand()
));
if (result.getResolvedValue().isPresent()) {
return result.getResolvedValue().get().getValue();
} else {
if (request.getEnvironment().getRenderEnvironment().getStrictMode()) {
throw new CalculationException(errorMessage(request.getPosition(), selectionErrorMessageGenerator.explain(request.getLeftOperand(), request.getRightOperand())));
} else {
return Undefined.UNDEFINED;
}
}
}
}