package org.smoothbuild.lang.function.def; import java.util.Set; import org.smoothbuild.lang.function.base.Parameter; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; /** * Pool of params that are assignable from argument with given type. For example * TypeParamsPool for smooth type 'File' will contain params with type 'File' * and 'Blob' as arguments of type 'File' can be assigned to 'Blob' param as * well. */ public class TypedParametersPool { private final Set<Parameter> optionalParameters; private final Set<Parameter> requiredParameters; public TypedParametersPool(Set<Parameter> optionalParameters, Set<Parameter> requiredParameters) { this.optionalParameters = optionalParameters; this.requiredParameters = requiredParameters; } public Set<Parameter> optionalParameters() { return optionalParameters; } public Set<Parameter> requiredParameters() { return requiredParameters; } public boolean hasCandidate() { return requiredParameters.size() == 1 || (requiredParameters.size() == 0 && optionalParameters.size() == 1); } public Parameter candidate() { Preconditions.checkState(hasCandidate(), "No candidate available"); if (requiredParameters.isEmpty()) { return optionalParameters.iterator().next(); } else { return requiredParameters.iterator().next(); } } public String toFormattedString() { return Parameter.parametersToString(Sets.union(requiredParameters, optionalParameters)); } public boolean isEmpty() { return optionalParameters.isEmpty() && requiredParameters.isEmpty(); } }