package com.hubspot.jinjava.lib.filter;
import java.util.ArrayList;
import java.util.List;
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.InterpretException;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
import com.hubspot.jinjava.lib.exptest.ExpTest;
import com.hubspot.jinjava.util.ForLoop;
import com.hubspot.jinjava.util.ObjectIterator;
@JinjavaDoc(
value = "Filters a sequence of objects by applying a test to the object and rejecting the ones with the test succeeding.",
params = {
@JinjavaParam(value = "seq", type = "Sequence to test"),
@JinjavaParam(value = "exp_test", type = "name of expression test", defaultValue = "truthy", desc = "Specify which expression test to run for making the selection")
},
snippets = {
@JinjavaSnippet(
code = "{% set some_numbers = [10, 12, 13, 3, 5, 17, 22] %}\n" +
"{% some_numbers|reject('even') %}")
})
public class RejectFilter implements Filter {
@Override
public String getName() {
return "reject";
}
@Override
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
List<Object> result = new ArrayList<>();
if (args.length == 0) {
throw new InterpretException(getName() + " requires an exp test to filter on", interpreter.getLineNumber());
}
ExpTest expTest = interpreter.getContext().getExpTest(args[0]);
if (expTest == null) {
throw new InterpretException("No exp test defined for name '" + args[0] + "'", interpreter.getLineNumber());
}
ForLoop loop = ObjectIterator.getLoop(var);
while (loop.hasNext()) {
Object val = loop.next();
if (!expTest.evaluate(val, interpreter)) {
result.add(val);
}
}
return result;
}
}