package org.jtwig.functions;
import org.jtwig.exceptions.CalculationException;
import org.jtwig.model.expression.Expression;
import org.jtwig.model.position.Position;
import org.jtwig.render.RenderRequest;
import java.util.List;
import static org.jtwig.util.ErrorMessageFormatter.errorMessage;
public class FunctionRequest extends RenderRequest {
private final Position position;
private final String functionName;
private final FunctionArguments functionArguments;
public FunctionRequest(RenderRequest request, Position position, String functionName, FunctionArguments functionArguments) {
super(request.getRenderContext(), request.getEnvironment());
this.position = position;
this.functionName = functionName;
this.functionArguments = functionArguments;
}
public Position getPosition() {
return position;
}
public int getNumberOfArguments () {
return functionArguments.size();
}
public List<Object> getArguments() {
return functionArguments.getValues();
}
public List<Expression> getExpressionArguments () {
return functionArguments.getExpressions();
}
public FunctionRequest minimumNumberOfArguments(int number) {
if (functionArguments.size() < number) {
throw exception(String.format("Expected at least %d arguments", number));
}
return this;
}
public FunctionRequest maximumNumberOfArguments(int number) {
if (functionArguments.size() > number) {
throw exception(String.format("Expected at most %d arguments", number));
}
return this;
}
public CalculationException exception(String message) {
return new CalculationException(errorMessage(position, String.format("Function %s error: %s", functionName, message)));
}
public CalculationException exception(String message, Throwable e) {
return new CalculationException(errorMessage(position, String.format("Function %s error: %s", functionName, message)), e);
}
public Object get(int index) {
return functionArguments.getValue(index);
}
public Expression getExpression (int index) { return functionArguments.getExpression(index); }
public Object[] getRemainingArguments(int start) {
return functionArguments.getRemainingArguments(start);
}
}