package org.smoothbuild.lang.function.base;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Strings.padEnd;
import org.smoothbuild.db.hashed.Hash;
import org.smoothbuild.lang.type.Type;
import com.google.common.hash.HashCode;
public class Parameter {
private final Type type;
private final String name;
private final boolean isRequired;
private final HashCode nameHash;
public static Parameter optionalParameter(Type type, String name) {
return parameter(type, name, false);
}
public static Parameter requiredParameter(Type type, String name) {
return parameter(type, name, true);
}
public static Parameter parameter(Type type, String name, boolean isRequired) {
return new Parameter(type, name, isRequired);
}
protected Parameter(Type type, String name, boolean isRequired) {
this.type = checkNotNull(type);
this.name = checkNotNull(name);
this.isRequired = isRequired;
this.nameHash = Hash.string(name);
}
public Type type() {
return type;
}
public String name() {
return name;
}
public boolean isRequired() {
return isRequired;
}
public HashCode nameHash() {
return nameHash;
}
public final boolean equals(Object object) {
if (!(object instanceof Parameter)) {
return false;
}
Parameter that = (Parameter) object;
return this.type.equals(that.type) && this.name.equals(that.name)
&& this.isRequired == that.isRequired;
}
public final int hashCode() {
return 17 * type.hashCode() + name.hashCode();
}
public String toPaddedString(int minTypeLength, int minNameLength) {
String typePart = padEnd(type.name(), minTypeLength, ' ') + ": ";
String namePart = padEnd(name, minNameLength, ' ');
return typePart + namePart;
}
public String toString() {
return "Param(" + type.name() + ": " + name + ")";
}
public static String parametersToString(Iterable<Parameter> parameters) {
int typeLength = longestParameterType(parameters);
int nameLength = longestParameterName(parameters);
StringBuilder builder = new StringBuilder();
for (Parameter parameter : parameters) {
builder.append(" " + parameter.toPaddedString(typeLength, nameLength) + "\n");
}
return builder.toString();
}
private static int longestParameterType(Iterable<Parameter> parameters) {
int result = 0;
for (Parameter parameter : parameters) {
result = Math.max(result, parameter.type().name().length());
}
return result;
}
private static int longestParameterName(Iterable<Parameter> parameters) {
int result = 0;
for (Parameter parameter : parameters) {
result = Math.max(result, parameter.name().length());
}
return result;
}
}