package org.jtwig.functions.impl.list;
import org.apache.commons.lang3.StringUtils;
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.ArrayList;
import java.util.List;
import java.util.Map;
public class JoinFunction extends SimpleJtwigFunction {
@Override
public String name() {
return "join";
}
@Override
public Object execute(FunctionRequest request) {
request.minimumNumberOfArguments(1).maximumNumberOfArguments(2);
String separator = "";
if (request.getNumberOfArguments() == 2) {
separator = getString(request, 1);
}
return join(request, request.get(0), separator);
}
private String getString(FunctionRequest request, int index) {
return getString(request, request.get(index));
}
private String getString(FunctionRequest request, Object value) {
return request.getEnvironment().getValueEnvironment().getStringConverter().convert(value);
}
private String join(FunctionRequest request, Object input, String separator) {
Converter<WrappedCollection> collectionConverter = request.getEnvironment().getValueEnvironment().getCollectionConverter();
List<String> pieces = new ArrayList<>();
WrappedCollection objects = collectionConverter.convert(input).or(WrappedCollection.singleton(input));
for (Map.Entry<String, Object> entry : objects) {
if (entry.getValue() != null && entry.getValue() != Undefined.UNDEFINED) {
pieces.add(getString(request, entry.getValue()));
}
}
return StringUtils.join(pieces, separator);
}
}