package org.smoothbuild.lang.function.def;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import org.smoothbuild.lang.function.base.Parameter;
public class MapToString {
public static String toString(Map<Parameter, Argument> paramToArgMap) {
int maxParamType = longestParameterType(paramToArgMap.keySet());
int maxParamName = longestParameterName(paramToArgMap.keySet());
int maxArgType = longestArgumentType(paramToArgMap.values());
int maxArgName = longestArgumentName(paramToArgMap.values());
int maxNumber = longestArgumentNumber(paramToArgMap.values());
StringBuilder builder = new StringBuilder();
for (Map.Entry<Parameter, Argument> entry : paramToArgMap.entrySet()) {
String paramPart = entry.getKey().toPaddedString(maxParamType, maxParamName);
Argument argument = entry.getValue();
String argPart = argument.toPaddedString(maxArgType, maxArgName, maxNumber);
builder.append(" " + paramPart + " <- " + argPart + "\n");
}
return builder.toString();
}
private static int longestParameterType(Set<Parameter> parameters) {
int result = 0;
for (Parameter parameter : parameters) {
result = Math.max(result, parameter.type().name().length());
}
return result;
}
private static int longestParameterName(Set<Parameter> parameters) {
int result = 0;
for (Parameter parameter : parameters) {
result = Math.max(result, parameter.name().length());
}
return result;
}
private static int longestArgumentType(Collection<Argument> arguments) {
int result = 0;
for (Argument argument : arguments) {
result = Math.max(result, argument.type().name().length());
}
return result;
}
private static int longestArgumentName(Collection<Argument> arguments) {
int result = 0;
for (Argument argument : arguments) {
result = Math.max(result, argument.nameSanitized().length());
}
return result;
}
private static int longestArgumentNumber(Collection<Argument> arguments) {
int maxNumber = 0;
for (Argument argument : arguments) {
maxNumber = Math.max(maxNumber, argument.number());
}
return Integer.toString(maxNumber).length();
}
}