package com.impossibl.stencil.ext.std;
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Strings.nullToEmpty;
import java.util.Map;
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
import com.impossibl.stencil.api.Named;
import com.impossibl.stencil.api.impl.AnnotatedCallableBase;
@Named("join")
public class JoinFunction extends AnnotatedCallableBase {
public Object doCall(@Named("objects") Object obj, @Named("deliminator") String delim, @Named("separator") String sep, @Named("nulls") Boolean includeNulls) {
delim = nullToEmpty(delim);
sep = nullToEmpty(sep);
includeNulls = firstNonNull(includeNulls,false);
Joiner joiner = Joiner.on(delim);
if (obj instanceof Map<?, ?>) {
Map<?,?> map = (Map<?, ?>) obj;
if(!includeNulls) {
map = Maps.filterValues(map, new Predicate<Object>() {
@Override
public boolean apply(Object value) {
return value != null;
}
});
}
return joiner.withKeyValueSeparator(sep).join(map);
}
else if (obj instanceof Iterable<?>) {
if(!includeNulls) {
joiner = joiner.skipNulls();
}
return joiner.join((Iterable<?>) obj);
}
return null;
}
}