package com.hubspot.jinjava.lib.filter; import java.util.ArrayList; import java.util.List; import java.util.Objects; import com.google.common.base.Joiner; import com.hubspot.jinjava.doc.annotations.JinjavaDoc; import com.hubspot.jinjava.doc.annotations.JinjavaParam; import com.hubspot.jinjava.doc.annotations.JinjavaSnippet; import com.hubspot.jinjava.interpret.JinjavaInterpreter; import com.hubspot.jinjava.util.ForLoop; import com.hubspot.jinjava.util.ObjectIterator; @JinjavaDoc( value = "Return a string which is the concatenation of the strings in the sequence.", params = { @JinjavaParam(value = "value", desc = "The values to join"), @JinjavaParam(value = "d", desc = "The separator string used to join the items"), @JinjavaParam(value = "attr", desc = "Optional dict object attribute to use in joining") }, snippets = { @JinjavaSnippet( code = "{{ [1, 2, 3]|join('|') }}", output = "1|2|3"), @JinjavaSnippet( code = "{{ [1, 2, 3]|join }}", output = "123"), @JinjavaSnippet( desc = "It is also possible to join certain attributes of an object", code = "{{ users|join(', ', attribute='username') }}") }) public class JoinFilter implements Filter { @Override public String getName() { return "join"; } @Override public Object filter(Object var, JinjavaInterpreter interpreter, String... args) { List<String> vals = new ArrayList<>(); String separator = ""; if (args.length > 0) { separator = args[0]; } String attr = null; if (args.length > 1) { attr = args[1]; } ForLoop loop = ObjectIterator.getLoop(var); while (loop.hasNext()) { Object val = loop.next(); if (attr != null) { val = interpreter.resolveProperty(val, attr); } vals.add(Objects.toString(val, "")); } return Joiner.on(separator).join(vals); } }