package openmods.utils;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.util.List;
import java.util.Set;
public class ObjectTester<T> implements ITester<T> {
public static class ClassTester<T> implements ITester<T> {
private final Class<? extends T> cls;
private final Result onMatch;
public ClassTester(Class<? extends T> cls, Result onMatch) {
this.cls = cls;
this.onMatch = onMatch;
}
public ClassTester(Class<? extends T> cls) {
this(cls, Result.ACCEPT);
}
@Override
public Result test(T o) {
return cls.isAssignableFrom(o.getClass())? onMatch : Result.CONTINUE;
}
}
public static <T> ITester<T> createClassTester(Class<? extends T> cls) {
return new ClassTester<T>(cls);
}
public static class ClassNameTester<T> implements ITester<T> {
private final Set<String> names = Sets.newHashSet();
private final Result onMatch;
public ClassNameTester(Result onMatch) {
this.onMatch = onMatch;
}
public ClassNameTester() {
this(Result.ACCEPT);
}
public ClassNameTester<T> addClasses(String... names) {
for (String name : names)
this.names.add(name);
return this;
}
public ClassNameTester<T> addClasses(Class<? extends T>... classes) {
for (Class<? extends T> cls : classes)
names.add(cls.getName());
return this;
}
@Override
public Result test(T o) {
return names.contains(o.getClass().getName())? onMatch : Result.CONTINUE;
}
}
public static <T> ObjectTester<T> create() {
return new ObjectTester<T>();
}
private List<ITester<T>> testers = Lists.newArrayList();
public ObjectTester<T> addTester(ITester<T> tester) {
testers.add(tester);
return this;
}
@Override
public Result test(T o) {
for (ITester<T> tester : testers) {
Result r = tester.test(o);
if (r != Result.CONTINUE) return r;
}
return Result.CONTINUE;
}
public boolean check(T o) {
return test(o) == Result.ACCEPT;
}
}