package org.jtwig.property.strategy.method.argument.group;
import com.google.common.base.Optional;
import org.jtwig.reflection.model.java.JavaMethod;
import org.jtwig.reflection.model.java.JavaMethodArgument;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class GroupingArgumentsService {
public Optional<List<ArgumentGroup>> groupArguments(JavaMethod method, Object[] arguments) {
if (method.isVarArgs()) {
if (arguments.length >= method.numberOfArguments() - 1) {
return Optional.of(groupVarArgs(method.arguments(), arguments));
}
} else {
if (arguments.length == method.numberOfArguments()) {
return Optional.of(groupSimpleArgs(method.arguments(), arguments, arguments.length));
}
}
return Optional.absent();
}
private List<ArgumentGroup> groupSimpleArgs(List<JavaMethodArgument> javaMethodArguments, Object[] arguments, int max) {
List<ArgumentGroup> groups = new ArrayList<>();
for (int i = 0; i < max; i++) {
JavaMethodArgument javaMethodArgument = javaMethodArguments.get(i);
groups.add(new SingleArgumentGroup(javaMethodArgument, arguments[i]));
}
return groups;
}
private List<ArgumentGroup> groupVarArgs(List<JavaMethodArgument> argumentList, Object[] arguments) {
int max = argumentList.size() - 1;
List<ArgumentGroup> result = groupSimpleArgs(argumentList, arguments, max);
result.add(new VarArgumentGroup(argumentList.get(max), Arrays.asList(arguments).subList(max, arguments.length)));
return result;
}
}