package sk.stuba.fiit.perconik.utilities.reflect.accessor;
import com.google.common.reflect.Invokable;
import com.google.common.reflect.TypeToken;
final class Utilities {
private Utilities() {}
static String format(final String format, final Object ... args) {
for (int i = 0; i < args.length; i ++) {
if (args[i] instanceof Class) {
args[i] = ((Class<?>) args[i]).getName();
}
}
return String.format(format, args);
}
static RuntimeException createArgument(final String format, final Object ... args) {
return new IllegalArgumentException(format(format, args));
}
static RuntimeException createState(final String format, final Object ... args) {
return new IllegalStateException(format(format, args));
}
static void throwArgument(final String format, final Object ... args) {
throw createArgument(format, args);
}
static void throwState(final String format, final Object ... args) {
throw createState(format(format, args));
}
static void checkArgument(final boolean expression, final String format, final Object ... args) {
if (!expression) {
throwArgument(format, args);
}
}
static void checkState(final boolean expression, final String format, final Object ... args) {
if (!expression) {
throwState(format, args);
}
}
static <T, R, S extends R> Invokable<T, S> specialize(final Invokable<T, R> invokable, final TypeToken<S> type) {
TypeToken<? extends R> base = invokable.getReturnType();
if (!type.unwrap().isAssignableFrom(base.unwrap())) {
throw new IllegalArgumentException("Invokable is known to return " + base + ", not " + type);
}
@SuppressWarnings("unchecked")
Invokable<T, S> specialized = (Invokable<T, S>) invokable;
return specialized;
}
}