package org.jtwig.render.expression.calculator; import org.jtwig.exceptions.CalculationException; import org.jtwig.model.expression.MapSelectionExpression; import org.jtwig.render.RenderRequest; import org.jtwig.render.expression.CalculateExpressionService; import org.jtwig.value.WrappedCollection; import org.jtwig.value.convert.Converter; import static org.jtwig.util.ErrorMessageFormatter.errorMessage; public class MapSelectionExpressionCalculator implements ExpressionCalculator<MapSelectionExpression> { @Override public Object calculate(RenderRequest request, MapSelectionExpression expression) { CalculateExpressionService calculateExpressionService = request.getEnvironment().getRenderEnvironment().getCalculateExpressionService(); Converter<WrappedCollection> collectionConverter = request.getEnvironment().getValueEnvironment().getCollectionConverter(); Object mapExpressionValue = calculateExpressionService.calculate(request, expression.getMapExpression()); Converter.Result<WrappedCollection> wrappedCollectionResult = collectionConverter.convert(mapExpressionValue); if (!wrappedCollectionResult.isDefined()) { throw new CalculationException(errorMessage(expression.getPosition(), String.format("Cannot convert %s to a map", mapExpressionValue))); } WrappedCollection collection = wrappedCollectionResult.get(); Object calculate = calculateExpressionService.calculate(request, expression.getSelectValue()); return collection.getValue(getString(request, calculate)); } private String getString(RenderRequest request, Object input) { return request.getEnvironment().getValueEnvironment().getStringConverter().convert(input); } }