package org.jtwig.functions.impl.mixed; import org.jtwig.functions.FunctionRequest; import org.jtwig.functions.SimpleJtwigFunction; import org.jtwig.value.Undefined; import org.jtwig.value.WrappedCollection; import org.jtwig.value.convert.Converter; import java.util.Iterator; import java.util.Map; public class LastFunction extends SimpleJtwigFunction { @Override public String name() { return "last"; } @Override public Object execute(FunctionRequest request) { request.minimumNumberOfArguments(1).maximumNumberOfArguments(1); Object input = request.get(0); Converter.Result<WrappedCollection> collectionResult = request.getEnvironment() .getValueEnvironment().getCollectionConverter() .convert(input); if (collectionResult.isDefined()) { Iterator<Map.Entry<String, Object>> iterator = collectionResult.get().iterator(); if (iterator.hasNext()) return last(iterator); else return Undefined.UNDEFINED; } else if (input instanceof String) { String argument = (String) input; return argument.length() > 0 ? argument.charAt(argument.length() - 1) : Undefined.UNDEFINED; } return input; } private Object last(Iterator<Map.Entry<String, Object>> iterator) { Map.Entry<String, Object> last = iterator.next(); while (iterator.hasNext()) { last = iterator.next(); } return last.getValue(); } }